src/custom/script.inc | 115 ++++++++++++++++++++++++++++++++++++++++++++++ src/custom/script_def.inc | 3 ++ src/map/script.c | 57 +++++++++++++++++++++++ src/map/script.h | 32 +++++++++++++ 4 files changed, 207 insertions(+) diff --git a/src/custom/script.inc b/src/custom/script.inc index 1e01c88..84a11e6 100644 --- a/src/custom/script.inc +++ b/src/custom/script.inc @@ -17,3 +17,118 @@ // script_pushint(st,1); // return 0; //} + +/*========================================== + * Modify the value of GID monster + * setmobdata , , ; + *------------------------------------------*/ +BUILDIN_FUNC(setmobdata) { + int mob_gid = script_getnum(st,2), + parameter = script_getnum(st,3), + value = script_getnum(st,4); + struct block_list *bl = map_id2bl( mob_gid ); + if ( bl == NULL ) { + ShowError( "buildin_setmobdata: Attempted to modify a non-existed GID %d.\n", mob_gid ); + return SCRIPT_CMD_FAILURE; + } + if ( bl->type != BL_MOB ) { + ShowError( "buildin_setmobdata: Attempted to modify not a monster. GID %d.\n", mob_gid ); + return SCRIPT_CMD_FAILURE; + } + { + TBL_MOB *md = (TBL_MOB*)bl; + switch( parameter ) { + case MOBDATA_MOBID: + ShowWarning( "buildin_setmobdata: Attempted to change MobID with type MOBDATA_MOBID.\n" ); + break; + case MOBDATA_LEVEL: md->level = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_HP: md->status.hp = cap_value(value, 1, SINT32_MAX); break; + case MOBDATA_MAXHP: md->status.max_hp = cap_value(value, 1, SINT32_MAX); break; + case MOBDATA_ATK_MIN: md->status.rhw.atk = cap_value(value, 1, md->status.rhw.atk2); break; + case MOBDATA_ATK_MAX: md->status.rhw.atk2 = cap_value(value, md->status.rhw.atk, SINT16_MAX); break; + case MOBDATA_MATK_MIN: md->status.matk_min = cap_value(value, 1, md->status.matk_max); break; + case MOBDATA_MATK_MAX: md->status.matk_max = cap_value(value, md->status.matk_min, SINT16_MAX); break; + case MOBDATA_DEF: md->status.def = cap_value(value, 0, SINT16_MAX); break; + case MOBDATA_MDEF: md->status.mdef = cap_value(value, 0, SINT16_MAX); break; + case MOBDATA_HIT: md->status.hit = cap_value(value, 0, SINT16_MAX); break; + case MOBDATA_FLEE: md->status.flee = cap_value(value, 0, SINT16_MAX); break; + case MOBDATA_CRITICAL: md->status.cri = cap_value(value, 0, SINT16_MAX); break; + case MOBDATA_PERFECT_DODGE: md->status.flee2 = cap_value(value, 0, SINT16_MAX); break; + case MOBDATA_STR: md->status.str = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_AGI: md->status.agi = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_VIT: md->status.vit = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_INT: md->status.int_ = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_DEX: md->status.dex = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_LUK: md->status.luk = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_ATTACK_RANGE: md->status.rhw.range = cap_value(value, 1, battle_config.area_size); break; + case MOBDATA_RACE: md->status.race = cap_value(value, 1, RC_MAX - 1); break; + case MOBDATA_ELEMENT_TYPE: md->status.def_ele = cap_value(value, 1, ELE_MAX-1); break; + case MOBDATA_ELEMENT_LEVEL: md->status.ele_lv = cap_value(value, 1, 4); break; + case MOBDATA_MODE: md->status.mode = cap_value(value, 1, SINT32_MAX); break; + case MOBDATA_MOVESPEED: md->status.speed = cap_value(value, MIN_WALK_SPEED, MAX_WALK_SPEED); break; + case MOBDATA_ATTACK_DELAY: md->status.adelay = cap_value(value, 1, SINT16_MAX); break; + case MOBDATA_ATTACK_MOTION: md->status.amotion = cap_value(value, 1, md->status.adelay); break; + case MOBDATA_DAMAGE_MOTION: md->status.dmotion = cap_value(value, 1, SINT16_MAX); break; + default: + ShowError( "buildin_setmobdata: Attempted to use non-existing parameter %d.\n", parameter ); + return SCRIPT_CMD_FAILURE; + } + } + return SCRIPT_CMD_SUCCESS; +} + +/*========================================== + * Retrieve the value of GID monster + * getmobdata , ; + *------------------------------------------*/ +BUILDIN_FUNC(getmobdata) { + int mob_gid = script_getnum(st,2), + parameter = script_getnum(st,3); + struct block_list *bl = map_id2bl( mob_gid ); + if ( bl == NULL ) { + ShowError( "buildin_getmobdata: Attempted to retrieve a non-existed GID %d.\n", mob_gid ); + return SCRIPT_CMD_FAILURE; + } + if ( bl->type != BL_MOB ) { + ShowError( "buildin_getmobdata: Attempted to retrieve not a monster. GID %d.\n", mob_gid ); + return SCRIPT_CMD_FAILURE; + } + { + TBL_MOB *md = (TBL_MOB*)bl; + switch( parameter ) { + case MOBDATA_MOBID: script_pushint( st, md->mob_id ); break; + case MOBDATA_LEVEL: script_pushint( st, md->level ); break; + case MOBDATA_HP: script_pushint( st, md->status.hp ); break; + case MOBDATA_MAXHP: script_pushint( st, md->status.max_hp ); break; + case MOBDATA_ATK_MIN: script_pushint( st, md->status.rhw.atk ); break; + case MOBDATA_ATK_MAX: script_pushint( st, md->status.rhw.atk2 ); break; + case MOBDATA_MATK_MIN: script_pushint( st, md->status.matk_min ); break; + case MOBDATA_MATK_MAX: script_pushint( st, md->status.matk_max ); break; + case MOBDATA_DEF: script_pushint( st, md->status.def ); break; + case MOBDATA_MDEF: script_pushint( st, md->status.mdef ); break; + case MOBDATA_HIT: script_pushint( st, md->status.hit ); break; + case MOBDATA_FLEE: script_pushint( st, md->status.flee ); break; + case MOBDATA_CRITICAL: script_pushint( st, md->status.cri ); break; + case MOBDATA_PERFECT_DODGE: script_pushint( st, md->status.flee2 ); break; + case MOBDATA_STR: script_pushint( st, md->status.str ); break; + case MOBDATA_AGI: script_pushint( st, md->status.agi ); break; + case MOBDATA_VIT: script_pushint( st, md->status.vit ); break; + case MOBDATA_INT: script_pushint( st, md->status.int_ ); break; + case MOBDATA_DEX: script_pushint( st, md->status.dex ); break; + case MOBDATA_LUK: script_pushint( st, md->status.luk ); break; + case MOBDATA_ATTACK_RANGE: script_pushint( st, md->status.rhw.range ); break; + case MOBDATA_RACE: script_pushint( st, md->status.race ); break; + case MOBDATA_ELEMENT_TYPE: script_pushint( st, md->status.def_ele ); break; + case MOBDATA_ELEMENT_LEVEL: script_pushint( st, md->status.ele_lv ); break; + case MOBDATA_MODE: script_pushint( st, md->status.mode ); break; + case MOBDATA_MOVESPEED: script_pushint( st, md->status.speed ); break; + case MOBDATA_ATTACK_DELAY: script_pushint( st, md->status.adelay ); break; + case MOBDATA_ATTACK_MOTION: script_pushint( st, md->status.amotion ); break; + case MOBDATA_DAMAGE_MOTION: script_pushint( st, md->status.dmotion ); break; + default : + ShowError( "buildin_getmobdata: Attempted to use non-existing parameter %d.\n", parameter ); + return SCRIPT_CMD_FAILURE; + } + } + return SCRIPT_CMD_SUCCESS; +} \ No newline at end of file diff --git a/src/custom/script_def.inc b/src/custom/script_def.inc index 3319eea..161ce8b 100644 --- a/src/custom/script_def.inc +++ b/src/custom/script_def.inc @@ -9,3 +9,6 @@ **/ //BUILDIN_DEF(example,""), + + BUILDIN_DEF(setmobdata,"iii"), + BUILDIN_DEF(getmobdata,"ii"), \ No newline at end of file diff --git a/src/map/script.c b/src/map/script.c index 326f3c0..797bb27 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2291,6 +2291,63 @@ void script_hardcoded_constants(void) { script_set_constant("SCSTART_LOADED",SCSTART_LOADED,false); script_set_constant("SCSTART_NORATEDEF",SCSTART_NORATEDEF,false); script_set_constant("SCSTART_NOICON",SCSTART_NOICON,false); + + /* setmobdata */ + script_set_constant("MOBDATA_MOBID",MOBDATA_MOBID,false); + script_set_constant("MOBDATA_LEVEL",MOBDATA_LEVEL,false); + script_set_constant("MOBDATA_HP",MOBDATA_HP,false); + script_set_constant("MOBDATA_MAXHP",MOBDATA_MAXHP,false); + script_set_constant("MOBDATA_ATK_MIN",MOBDATA_ATK_MIN,false); + script_set_constant("MOBDATA_ATK_MAX",MOBDATA_ATK_MAX,false); + script_set_constant("MOBDATA_MATK_MIN",MOBDATA_MATK_MIN,false); + script_set_constant("MOBDATA_MATK_MAX",MOBDATA_MATK_MAX,false); + script_set_constant("MOBDATA_DEF",MOBDATA_DEF,false); + script_set_constant("MOBDATA_MDEF",MOBDATA_MDEF,false); + script_set_constant("MOBDATA_HIT",MOBDATA_HIT,false); + script_set_constant("MOBDATA_FLEE",MOBDATA_FLEE,false); + script_set_constant("MOBDATA_CRITICAL",MOBDATA_CRITICAL,false); + script_set_constant("MOBDATA_PERFECT_DODGE",MOBDATA_PERFECT_DODGE,false); + script_set_constant("MOBDATA_STR",MOBDATA_STR,false); + script_set_constant("MOBDATA_AGI",MOBDATA_AGI,false); + script_set_constant("MOBDATA_VIT",MOBDATA_VIT,false); + script_set_constant("MOBDATA_INT",MOBDATA_INT,false); + script_set_constant("MOBDATA_DEX",MOBDATA_DEX,false); + script_set_constant("MOBDATA_LUK",MOBDATA_LUK,false); + script_set_constant("MOBDATA_ATTACK_RANGE",MOBDATA_ATTACK_RANGE,false); + script_set_constant("MOBDATA_RACE",MOBDATA_RACE,false); + script_set_constant("MOBDATA_ELEMENT_TYPE",MOBDATA_ELEMENT_TYPE,false); + script_set_constant("MOBDATA_ELEMENT_LEVEL",MOBDATA_ELEMENT_LEVEL,false); + script_set_constant("MOBDATA_MODE",MOBDATA_MODE,false); + script_set_constant("MOBDATA_MOVESPEED",MOBDATA_MOVESPEED,false); + script_set_constant("MOBDATA_ATTACK_DELAY",MOBDATA_ATTACK_DELAY,false); + script_set_constant("MOBDATA_ATTACK_MOTION",MOBDATA_ATTACK_MOTION,false); + script_set_constant("MOBDATA_DAMAGE_MOTION",MOBDATA_DAMAGE_MOTION,false); + + /* e_mode */ + script_set_constant("MD_CANMOVE",MD_CANMOVE,false); + script_set_constant("MD_LOOTER",MD_LOOTER,false); + script_set_constant("MD_AGGRESSIVE",MD_AGGRESSIVE,false); + script_set_constant("MD_ASSIST",MD_ASSIST,false); + script_set_constant("MD_CASTSENSOR_IDLE",MD_CASTSENSOR_IDLE,false); + script_set_constant("MD_BOSS",MD_BOSS,false); + script_set_constant("MD_PLANT",MD_PLANT,false); + script_set_constant("MD_CANATTACK",MD_CANATTACK,false); + script_set_constant("MD_DETECTOR",MD_DETECTOR,false); + script_set_constant("MD_CASTSENSOR_CHASE",MD_CASTSENSOR_CHASE,false); + script_set_constant("MD_CHANGECHASE",MD_CHANGECHASE,false); + script_set_constant("MD_ANGRY",MD_ANGRY,false); + script_set_constant("MD_CHANGETARGET_MELEE",MD_CHANGETARGET_MELEE,false); + script_set_constant("MD_CHANGETARGET_CHASE",MD_CHANGETARGET_CHASE,false); + script_set_constant("MD_TARGETWEAK",MD_TARGETWEAK,false); + script_set_constant("MD_RANDOMTARGET",MD_RANDOMTARGET,false); + script_set_constant("MD_IGNOREMELEE",MD_IGNOREMELEE,false); + script_set_constant("MD_IGNOREMAGIC",MD_IGNOREMAGIC,false); + script_set_constant("MD_IGNORERANGED",MD_IGNORERANGED,false); + script_set_constant("MD_MVP",MD_MVP,false); + script_set_constant("MD_IGNOREMISC",MD_IGNOREMISC,false); + script_set_constant("MD_KNOCKBACK_IMMUNE",MD_KNOCKBACK_IMMUNE,false); + script_set_constant("MD_NORANDOM_WALK",MD_NORANDOM_WALK,false); + script_set_constant("MD_NOCAST_SKILL",MD_NOCAST_SKILL,false); } /*========================================== diff --git a/src/map/script.h b/src/map/script.h index 87dc604..abe1a06 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -297,6 +297,38 @@ enum script_parse_options { SCRIPT_RETURN_EMPTY_SCRIPT = 0x4// returns the script object instead of NULL for empty scripts }; +enum mobdata_type { + MOBDATA_MOBID = 1, + MOBDATA_LEVEL, + MOBDATA_HP, + MOBDATA_MAXHP, + MOBDATA_ATK_MIN, + MOBDATA_ATK_MAX, + MOBDATA_MATK_MIN, + MOBDATA_MATK_MAX, + MOBDATA_DEF, + MOBDATA_MDEF, + MOBDATA_HIT, + MOBDATA_FLEE, + MOBDATA_CRITICAL, + MOBDATA_PERFECT_DODGE, + MOBDATA_STR, + MOBDATA_AGI, + MOBDATA_VIT, + MOBDATA_INT, + MOBDATA_DEX, + MOBDATA_LUK, + MOBDATA_ATTACK_RANGE, + MOBDATA_RACE, + MOBDATA_ELEMENT_TYPE, + MOBDATA_ELEMENT_LEVEL, + MOBDATA_MODE, + MOBDATA_MOVESPEED, + MOBDATA_ATTACK_DELAY, + MOBDATA_ATTACK_MOTION, + MOBDATA_DAMAGE_MOTION, +}; + /** * used to generate quick script_array entries **/