class_name Constants enum Gender { Female, Male, Both, Server, } ## rAthena: enum pincode_state enum PinCodeState { Ok = 0, Ask = 1, NotSet = 2, Expired = 3, New = 4, Illegal = 5, KSSN = 6, Passed = 7, Wrong = 8, } enum LoginFailedReason { ServerClosed = 1, AlreadyLoggedIn = 2, AlreadyOnline = 8, } enum LoginFailedReason2 { UnregisteredId, IncorrectPassword, IdExpired, RejectedFromServer, BlockedByGMTeam, GameOutdated, LoginProhibitedUntil, ServerFull, CompanyAccountLimitReached, } enum CharacterCreationFailedReason { CharacterNameAlreadyInUse, NotOldEnough, NotAllowedToUseSlot = 3, CharacterCreationFailed = 255, } enum StatusType { Weight, MaximumWeight, MovementSpeed, BaseLevel, JobLevel, } enum EmotionType { Surprise, Question, Delight, Throb, Sweat, Aha, Fret, Anger, Money, Think, Scissor, Rock, Wrap, Flag, BigThrob, Thanks, Kek, Sorry, Smile, # ... TODO } enum Job { Novice = 0, Swordman = 1, Magician = 2, Archer = 3, Acolyte = 4, } enum Direction { South, SouthWest, West, NorthWest, North, NorthEast, East, SouthEast, } static var PacketDB = { LoginServerLoginPacket.HEADER: LoginServerLoginPacket, LoginServerKeepAlivePacket.HEADER: LoginServerKeepAlivePacket, CharacterServerLoginPacket.HEADER: CharacterServerLoginPacket, CharacterServerKeepAlivePacket.HEADER: CharacterServerKeepAlivePacket, RequestCharacterListPacket.HEADER: RequestCharacterListPacket, SelectCharacterPacket.HEADER: SelectCharacterPacket, MapServerLoginPacket.HEADER: MapServerLoginPacket, MapLoadedPacket.HEADER: MapLoadedPacket, SendChatMessagePacket.HEADER: SendChatMessagePacket, LoginServerLoginSuccessPacket.HEADER: LoginServerLoginSuccessPacket, CharacterServerLoginSuccessPacket.HEADER: CharacterServerLoginSuccessPacket, CharacterServerLoginSuccessCharacterListPacket.HEADER: CharacterServerLoginSuccessCharacterListPacket, CharacterListSizePacket.HEADER: CharacterListSizePacket, LoginFailedPacket.HEADER: LoginFailedPacket, LoginFailedPacket2.HEADER: LoginFailedPacket2, BlockCharacterPacket.HEADER: BlockCharacterPacket, PinCodeStatePacket.HEADER: PinCodeStatePacket, RequestCharacterListSuccessPacket.HEADER: RequestCharacterListSuccessPacket, CharacterSelectionSuccessPacket.HEADER: CharacterSelectionSuccessPacket, CharacterSelectionFailedPacket.HEADER: CharacterSelectionFailedPacket, CreateCharacterPacket.HEADER: CreateCharacterPacket, CreateCharacterSuccessPacket.HEADER: CreateCharacterSuccessPacket, CharacterCreationFailedPacket.HEADER: CharacterCreationFailedPacket, MapServerLoginSuccessPacket.HEADER: MapServerLoginSuccessPacket, FriendListPacket.HEADER: FriendListPacket, ServerMessagePacket.HEADER: ServerMessagePacket, ChangeMapPacket.HEADER: ChangeMapPacket, ParameterChangePacket.HEADER: ParameterChangePacket, CoupleStatusPacket.HEADER: CoupleStatusPacket, UpdateAttackRangePacket.HEADER: UpdateAttackRangePacket, NewMailStatusPacket.HEADER: NewMailStatusPacket, QuestListPacket.HEADER: QuestListPacket, AchievementUpdatePacket.HEADER: AchievementUpdatePacket, AchievementListPacket.HEADER: AchievementListPacket, UpdateCriticalWeightPacket.HEADER: UpdateCriticalWeightPacket, SpriteChangePacket.HEADER: SpriteChangePacket, InventoryStartPacket.HEADER: InventoryStartPacket, RegularItemListPacket.HEADER: RegularItemListPacket, EquippableItemListPacket.HEADER: EquippableItemListPacket, InventoryEndPacket.HEADER: InventoryEndPacket, EquippableSwitchItemListPacket.HEADER: EquippableSwitchItemListPacket, MapTypePacket.HEADER: MapTypePacket, EntityAppeared2Packet.HEADER: EntityAppeared2Packet, UpdateSkillTreePacket.HEADER: UpdateSkillTreePacket, UpdateHotkeysPacket.HEADER: UpdateHotkeysPacket, ParameterChange2Packet.HEADER: ParameterChange2Packet, InitialStatusPacket.HEADER: InitialStatusPacket, ParameterChange3Packet.HEADER: ParameterChange3Packet, UpdatePartyInvitationState.HEADER: UpdatePartyInvitationState, UpdateShowEquipPacket.HEADER: UpdateShowEquipPacket, UpdateConfigurationPacket.HEADER: UpdateConfigurationPacket, ReputationPacket.HEADER: ReputationPacket, QuestEffectPacket.HEADER: QuestEffectPacket, MovingEntityAppearedPacket.HEADER: MovingEntityAppearedPacket, EntityDisappearedPacket.HEADER: EntityDisappearedPacket, NavigateToTargetPacket.HEADER: NavigateToTargetPacket, BroadcastFormattedMessagePacket.HEADER: BroadcastFormattedMessagePacket, DisplayEmotionPacket.HEADER: DisplayEmotionPacket, CloseDialogButtonPacket.HEADER: CloseDialogButtonPacket, } class FilePaths: const female := "여" const male := "남" const player_head := "인간족/머리통" const player_body := "인간족/몸통" const male_head_lookup := [2, 2, 1, 7, 5, 4, 3, 6, 8, 9, 10, 12, 11] const female_head_lookup := [2, 2, 4, 7, 1, 5, 3, 6, 12, 10, 9, 11, 8] static func get_gender_path(gender: Gender) -> String: if gender == Gender.Female: return female else: return male static func get_job_path(job_id: int) -> String: match job_id: Job.Novice: # NOVICE return "초보자" Job.Swordman: # SWORDMAN return "검사" Job.Magician: # MAGICIAN return "마법사" Job.Archer: # ARCHER return "궁수" Job.Acolyte: # ACOLYTE return "성직자" 5: # MERCHANT return "상인" 6: # THIEF return "도둑" 7: # KNIGHT return "기사" 8: # PRIEST return "성투사" 9: # WIZARD return "위저드" 10: # BLACKSMITH return "제철공" 11: # HUNTER return "헌터" # ... TODO _: # NOVICE return "초보자" static func get_player_head(gender: Gender, head_id: int) -> String: var real_head_id := head_id if gender == Gender.Female and head_id < female_head_lookup.size(): real_head_id = female_head_lookup[head_id] elif gender == Gender.Male and head_id < male_head_lookup.size(): real_head_id = male_head_lookup[head_id] return "%s/%s/%s_%s" % [ player_head, get_gender_path(gender), real_head_id, get_gender_path(gender), ] static func get_player_body(gender: Gender, job_id: int): return "%s/%s/%s_%s" % [ player_body, get_gender_path(gender), get_job_path(job_id), get_gender_path(gender), ]