Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use CrtrExpLevel typedef for most level-related stuff #3820

Merged
merged 12 commits into from
Jan 28, 2025
6 changes: 3 additions & 3 deletions src/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -1793,7 +1793,7 @@ TbBool create_empty_high_score_table(void)
{
int i;
int npoints = 100 * VISIBLE_HIGH_SCORES_COUNT;
int nlevel = 1 * VISIBLE_HIGH_SCORES_COUNT;
int nmap = 1 * VISIBLE_HIGH_SCORES_COUNT;
long arr_size = campaign.hiscore_count * sizeof(struct HighScore);
if (campaign.hiscore_table == NULL)
campaign.hiscore_table = (struct HighScore *)calloc(arr_size, 1);
Expand All @@ -1804,9 +1804,9 @@ TbBool create_empty_high_score_table(void)
if (i >= campaign.hiscore_count) break;
sprintf(campaign.hiscore_table[i].name, "Bullfrog");
campaign.hiscore_table[i].score = npoints;
campaign.hiscore_table[i].lvnum = nlevel;
campaign.hiscore_table[i].lvnum = nmap;
npoints -= 100;
nlevel -= 1;
nmap -= 1;
}
while (i < campaign.hiscore_count)
{
Expand Down
2 changes: 1 addition & 1 deletion src/config_rules.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ const struct NamedField rules_rooms_named_fields[] = {
{"PRISONBREAKCHANCE", &game.conf.rules.rooms.prison_break_chance, var_type(game.conf.rules.rooms.prison_break_chance ), 0, ULONG_MAX},
{"TORTUREDEATHCHANCE", &game.conf.rules.rooms.torture_death_chance, var_type(game.conf.rules.rooms.torture_death_chance ), 0, 100},
{"BARRACKMAXPARTYSIZE", &game.conf.rules.rooms.barrack_max_party_size, var_type(game.conf.rules.rooms.barrack_max_party_size ), 0, GROUP_MEMBERS_COUNT},
{"TRAININGROOMMAXLEVEL", &game.conf.rules.rooms.training_room_max_level, var_type(game.conf.rules.rooms.training_room_max_level ), 0, 11},
{"TRAININGROOMMAXLEVEL", &game.conf.rules.rooms.training_room_max_level, var_type(game.conf.rules.rooms.training_room_max_level ), 0,CREATURE_MAX_LEVEL+1},
{NULL, NULL, 0, 0, 0},
};

Expand Down
2 changes: 1 addition & 1 deletion src/config_rules.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ struct RoomRulesConfig {
unsigned char bodies_for_vampire;
unsigned short graveyard_convert_time;
short barrack_max_party_size;
unsigned short training_room_max_level;
CrtrExpLevel training_room_max_level;
TbBool scavenge_good_allowed;
TbBool scavenge_neutral_allowed;
unsigned long time_between_prison_break;
Expand Down
4 changes: 2 additions & 2 deletions src/creature_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,11 +339,11 @@ TbBool creature_can_gain_experience(const struct Thing *thing)
struct Dungeon* dungeon = get_dungeon(thing->owner);
struct CreatureControl* cctrl = creature_control_get_from_thing(thing);
// Creatures which reached players max level can't be trained
if (cctrl->explevel >= dungeon->creature_max_level[thing->model])
if (cctrl->exp_level >= dungeon->creature_max_level[thing->model])
return false;
// Creatures which reached absolute max level and have no grow up creature
struct CreatureStats* crstat = creature_stats_get_from_thing(thing);
if ((cctrl->explevel >= (CREATURE_MAX_LEVEL-1)) && (crstat->grow_up == 0))
if ((cctrl->exp_level >= (CREATURE_MAX_LEVEL-1)) && (crstat->grow_up == 0))
return false;
return true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/creature_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ struct CreatureControl {
ThingIndex players_prev_creature_idx;
ThingIndex players_next_creature_idx;
unsigned short slap_turns;
unsigned char explevel;
CrtrExpLevel exp_level;
long exp_points;
long prev_exp_points;
struct Coord3d moveto_pos;
Expand Down
40 changes: 20 additions & 20 deletions src/creature_groups.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ extern "C" {
struct Thing *get_highest_experience_and_score_creature_in_group(struct Thing *grptng)
{
struct CreatureControl* cctrl = creature_control_get_from_thing(grptng);
CrtrExpLevel best_explevel = 0;
CrtrExpLevel best_exp_level = 0;
long best_score = 0;
struct Thing* best_creatng = INVALID_THING;
long i = cctrl->group_info & TngGroup_LeaderIndex;
Expand All @@ -62,11 +62,11 @@ struct Thing *get_highest_experience_and_score_creature_in_group(struct Thing *g
if (creature_control_invalid(cctrl))
break;
// Per-thing code
if (best_explevel <= cctrl->explevel) {
if (best_exp_level <= cctrl->exp_level) {
long score = get_creature_thing_score(ctng);
// If got a new best score, or best level changed - update best values
if ((best_score < score) || (best_explevel < cctrl->explevel)) {
best_explevel = cctrl->explevel;
if ((best_score < score) || (best_exp_level < cctrl->exp_level)) {
best_exp_level = cctrl->exp_level;
best_score = score;
best_creatng = ctng;
}
Expand Down Expand Up @@ -388,7 +388,7 @@ static short creatures_group_has_special_digger_to_lead(struct Thing* grptng)
struct Thing* get_best_creature_to_lead_group(struct Thing* grptng)
{
struct CreatureControl* cctrl = creature_control_get_from_thing(grptng);
CrtrExpLevel best_explevel = 0;
CrtrExpLevel best_exp_level = 0;
long best_score = 0;
short has_digger = 0;
TbBool is_digger = 0;
Expand Down Expand Up @@ -424,19 +424,19 @@ struct Thing* get_best_creature_to_lead_group(struct Thing* grptng)
// If the current unit does not defend party, overwrite any unit that does.
if (bcctrl->party_objective == CHeroTsk_DefendParty)
{
best_explevel = cctrl->explevel;
best_exp_level = cctrl->exp_level;
best_score = score;
best_creatng = ctng;
}
else
{
// Otherwise the level needs to be at least as high
if (best_explevel <= cctrl->explevel)
if (best_exp_level <= cctrl->exp_level)
{
// For equal levels, the score is most important
if ((score > best_score) || (cctrl->explevel > best_explevel))
if ((score > best_score) || (cctrl->exp_level > best_exp_level))
{
best_explevel = cctrl->explevel;
best_exp_level = cctrl->exp_level;
best_score = score;
best_creatng = ctng;
}
Expand All @@ -451,12 +451,12 @@ struct Thing* get_best_creature_to_lead_group(struct Thing* grptng)
{
if (has_digger < 1 || is_digger) // if we want a digger, do not consider non-diggers
{
if (best_explevel <= cctrl->explevel)
if (best_exp_level <= cctrl->exp_level)
{
// For equal levels, the score is most important
if ((score > best_score) || (cctrl->explevel > best_explevel))
if ((score > best_score) || (cctrl->exp_level > best_exp_level))
{
best_explevel = cctrl->explevel;
best_exp_level = cctrl->exp_level;
best_score = score;
best_creatng = ctng;
}
Expand Down Expand Up @@ -585,7 +585,7 @@ TbBool create_party(const char *prtname)
return true;
}

TbBool add_member_to_party(int party_id, long crtr_model, long crtr_level, long carried_gold, long objctv_id, long countdown)
TbBool add_member_to_party(int party_id, long crtr_model, CrtrExpLevel exp_level, long carried_gold, long objctv_id, long countdown)
{
if ((party_id < 0) && (party_id >= CREATURE_PARTYS_COUNT))
{
Expand All @@ -603,15 +603,15 @@ TbBool add_member_to_party(int party_id, long crtr_model, long crtr_level, long
member->flags &= ~TrgF_DISABLED;
member->crtr_kind = crtr_model;
member->carried_gold = carried_gold;
member->crtr_level = crtr_level-1;
member->exp_level = exp_level-1;
member->field_6F = 1;
member->objectv = objctv_id;
member->countdown = countdown;
party->members_num++;
return true;
}

TbBool delete_member_from_party(int party_id, long crtr_model, long crtr_level)
TbBool delete_member_from_party(int party_id, long crtr_model, CrtrExpLevel exp_level)
{
if ((party_id < 0) && (party_id >= CREATURE_PARTYS_COUNT))
{
Expand All @@ -623,7 +623,7 @@ TbBool delete_member_from_party(int party_id, long crtr_model, long crtr_level)
for (int i = 0; i < party->members_num; i++)
{
struct PartyMember* member = &(party->members[i]);
if ((member->crtr_kind == crtr_model) && (member->crtr_level == (crtr_level-1)))
if ((member->crtr_kind == crtr_model) && (member->exp_level == (exp_level-1)))
{
memmove(member, member + 1, sizeof(*member) * (party->members_num - i - 1));
party->members_num--;
Expand Down Expand Up @@ -903,7 +903,7 @@ struct Thing *script_process_new_party(struct Party *party, PlayerNumber plyr_id
break;
}
struct PartyMember* member = &(party->members[k]);
struct Thing* thing = script_create_new_creature(plyr_idx, member->crtr_kind, location, member->carried_gold, member->crtr_level, SpwnT_Default);
struct Thing* thing = script_create_new_creature(plyr_idx, member->crtr_kind, location, member->carried_gold, member->exp_level, SpwnT_Default);
if (!thing_is_invalid(thing))
{
struct CreatureControl* cctrl = creature_control_get_from_thing(thing);
Expand Down Expand Up @@ -931,7 +931,7 @@ struct Thing *script_process_new_party(struct Party *party, PlayerNumber plyr_id
// if best and current unit want to defend party, or neither do, the strongest will be leader
if (((cctrl->party_objective == CHeroTsk_DefendParty) && (bestctrl->party_objective == CHeroTsk_DefendParty)) || ((cctrl->party_objective != CHeroTsk_DefendParty) && (bestctrl->party_objective != CHeroTsk_DefendParty)))
{
if ((cctrl->explevel > bestctrl->explevel) || ((cctrl->explevel == bestctrl->explevel) && (get_creature_thing_score(thing) > get_creature_thing_score(bestng))))
if ((cctrl->exp_level > bestctrl->exp_level) || ((cctrl->exp_level == bestctrl->exp_level) && (get_creature_thing_score(thing) > get_creature_thing_score(bestng))))
{
add_creature_to_group_as_leader(thing, grptng);
leadtng = thing;
Expand All @@ -954,9 +954,9 @@ struct Thing *script_process_new_party(struct Party *party, PlayerNumber plyr_id
return leadtng;
}

void script_process_new_tunneller_party(PlayerNumber plyr_idx, long prty_id, TbMapLocation location, TbMapLocation heading, unsigned char crtr_level, unsigned long carried_gold)
void script_process_new_tunneller_party(PlayerNumber plyr_idx, long prty_id, TbMapLocation location, TbMapLocation heading, CrtrExpLevel exp_level, unsigned long carried_gold)
{
struct Thing* ldthing = script_process_new_tunneler(plyr_idx, location, heading, crtr_level, carried_gold);
struct Thing* ldthing = script_process_new_tunneler(plyr_idx, location, heading, exp_level, carried_gold);
if (thing_is_invalid(ldthing))
{
ERRORLOG("Couldn't create tunneling group leader");
Expand Down
8 changes: 4 additions & 4 deletions src/creature_groups.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ struct PartyMember { // sizeof = 13
ThingModel crtr_kind;
unsigned char objectv;
long countdown;
unsigned char crtr_level;
CrtrExpLevel exp_level;
unsigned short carried_gold;
unsigned short field_6F;
};
Expand Down Expand Up @@ -99,13 +99,13 @@ TbBool make_group_member_leader(struct Thing *leadtng);

TbBool create_party(const char *prtname);
int get_party_index_of_name(const char *prtname);
TbBool add_member_to_party(int party_id, long crtr_model, long crtr_level, long carried_gold, long objctv_id, long countdown);
TbBool delete_member_from_party(int party_id, long crtr_model, long crtr_level);
TbBool add_member_to_party(int party_id, long crtr_model, CrtrExpLevel exp_level, long carried_gold, long objctv_id, long countdown);
TbBool delete_member_from_party(int party_id, long crtr_model, CrtrExpLevel exp_level);
long process_obey_leader(struct Thing *thing);
void leader_find_positions_for_followers(struct Thing *leadtng);

struct Thing *script_process_new_party(struct Party *party, PlayerNumber plyr_idx, TbMapLocation location, long copies_num);
void script_process_new_tunneller_party(PlayerNumber plyr_idx, long prty_id, TbMapLocation location, TbMapLocation heading, unsigned char crtr_level, unsigned long carried_gold);
void script_process_new_tunneller_party(PlayerNumber plyr_idx, long prty_id, TbMapLocation location, TbMapLocation heading, CrtrExpLevel exp_level, unsigned long carried_gold);
/******************************************************************************/
#ifdef __cplusplus
}
Expand Down
8 changes: 4 additions & 4 deletions src/creature_instances.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,10 @@ void creature_increase_available_instances(struct Thing *thing)
int k = crstat->learned_instance_id[i];
if (k > 0)
{
if (crstat->learned_instance_level[i] <= cctrl->explevel+1) {
if (crstat->learned_instance_level[i] <= cctrl->exp_level+1) {
cctrl->instance_available[k] = true;
}
else if ( (crstat->learned_instance_level[i] > cctrl->explevel+1) && !(game.conf.rules.game.classic_bugs_flags & ClscBug_RebirthKeepsSpells) )
else if ( (crstat->learned_instance_level[i] > cctrl->exp_level+1) && !(game.conf.rules.game.classic_bugs_flags & ClscBug_RebirthKeepsSpells) )
{
cctrl->instance_available[k] = false;
}
Expand Down Expand Up @@ -564,11 +564,11 @@ long instf_creature_cast_spell(struct Thing *creatng, long *param)

if (target != NULL)
{
creature_cast_spell_at_thing(creatng, target, spl_idx, cctrl->explevel);
creature_cast_spell_at_thing(creatng, target, spl_idx, cctrl->exp_level);
}
else
{
creature_cast_spell(creatng, spl_idx, cctrl->explevel, cctrl->targtstl_x, cctrl->targtstl_y);
creature_cast_spell(creatng, spl_idx, cctrl->exp_level, cctrl->targtstl_x, cctrl->targtstl_y);
}

// Start cooldown after spell effect activates
Expand Down
2 changes: 1 addition & 1 deletion src/creature_jobs.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ TbBool attempt_anger_job_mad_psycho(struct Thing *creatng)
TbBool attempt_anger_job_persuade(struct Thing *creatng)
{
struct CreatureControl* cctrl = creature_control_get_from_thing(creatng);
if (cctrl->explevel <= 5) {
if (cctrl->exp_level <= 5) {
return false;
}
if (!can_change_from_state_to(creatng, creatng->active_state, CrSt_CreaturePersuade)) {
Expand Down
10 changes: 5 additions & 5 deletions src/creature_states.c
Original file line number Diff line number Diff line change
Expand Up @@ -1680,7 +1680,7 @@ void set_creature_size_stuff(struct Thing *creatng)
}
else
{
creatng->sprite_size = game.conf.crtr_conf.sprite_size + (game.conf.crtr_conf.sprite_size * game.conf.crtr_conf.exp.size_increase_on_exp * cctrl->explevel) / 100;
creatng->sprite_size = game.conf.crtr_conf.sprite_size + (game.conf.crtr_conf.sprite_size * game.conf.crtr_conf.exp.size_increase_on_exp * cctrl->exp_level) / 100;
}
}

Expand All @@ -1700,7 +1700,7 @@ short creature_change_from_chicken(struct Thing *creatng)
struct Thing *efftng = create_effect_element(&creatng->mappos, TngEffElm_Chicken, creatng->owner);
if (!thing_is_invalid(efftng))
{
long n = (10 - cctrl->countdown) * (game.conf.crtr_conf.sprite_size + (game.conf.crtr_conf.sprite_size * game.conf.crtr_conf.exp.size_increase_on_exp * cctrl->explevel) / 100) / 10;
long n = (10 - cctrl->countdown) * (game.conf.crtr_conf.sprite_size + (game.conf.crtr_conf.sprite_size * game.conf.crtr_conf.exp.size_increase_on_exp * cctrl->exp_level) / 100) / 10;
unsigned long k = get_creature_anim(creatng, 0);
set_thing_draw(efftng, k, 256, n, -1, 0, ODC_Default);
clear_flag(efftng->rendering_flags, TRF_Transpar_Flags);
Expand Down Expand Up @@ -4624,15 +4624,15 @@ TbBool check_experience_upgrade(struct Thing *thing)
struct Dungeon *dungeon = get_dungeon(thing->owner);
struct CreatureControl *cctrl = creature_control_get_from_thing(thing);
struct CreatureStats *crstat = creature_stats_get_from_thing(thing);
long i = crstat->to_level[cctrl->explevel] << 8;
long i = crstat->to_level[cctrl->exp_level] << 8;
if (cctrl->exp_points < i)
{
return false;
}
cctrl->exp_points -= i;
if (cctrl->explevel < dungeon->creature_max_level[thing->model])
if (cctrl->exp_level < dungeon->creature_max_level[thing->model])
{
if ((cctrl->explevel < CREATURE_MAX_LEVEL - 1) || (crstat->grow_up != 0))
if ((cctrl->exp_level < CREATURE_MAX_LEVEL - 1) || (crstat->grow_up != 0))
{
cctrl->exp_level_up = true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/creature_states_combt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1795,7 +1795,7 @@ long ranged_combat_move(struct Thing *thing, struct Thing *enmtng, MapCoordDelta
if (enmdist < subtile_coord(3,0)) {
creature_retreat_from_combat(thing, enmtng, nstat, 1);
} else
if (enmdist > compute_creature_attack_range(subtile_coord(8,0), 0, cctrl->explevel)) {
if (enmdist > compute_creature_attack_range(subtile_coord(8,0), 0, cctrl->exp_level)) {
creature_move_to(thing, &enmtng->mappos, cctrl->max_speed, 0, 0);
}
return thing_in_field_of_view(thing, enmtng);
Expand Down
4 changes: 2 additions & 2 deletions src/creature_states_hero.c
Original file line number Diff line number Diff line change
Expand Up @@ -1299,14 +1299,14 @@ TbBool script_support_send_tunneller_to_appropriate_dungeon(struct Thing *creatn
return send_tunneller_to_point_in_dungeon(creatng, plyr_idx, &pos);
}

struct Thing *script_process_new_tunneler(unsigned char plyr_idx, TbMapLocation location, TbMapLocation heading, unsigned char crtr_level, unsigned long carried_gold)
struct Thing *script_process_new_tunneler(unsigned char plyr_idx, TbMapLocation location, TbMapLocation heading, CrtrExpLevel exp_level, unsigned long carried_gold)
{
ThingModel diggerkind = get_players_special_digger_model(plyr_idx);
struct Thing* creatng = script_create_creature_at_location(plyr_idx, diggerkind, location, SpwnT_Default);
if (thing_is_invalid(creatng))
return INVALID_THING;
creatng->creature.gold_carried = carried_gold;
init_creature_level(creatng, crtr_level);
init_creature_level(creatng, exp_level);
switch (get_map_location_type(heading))
{
case MLoc_ACTIONPOINT:
Expand Down
2 changes: 1 addition & 1 deletion src/creature_states_hero.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ short setup_person_tunnel_to_position(struct Thing *creatng, MapSubtlCoord stl_x
long get_best_dungeon_to_tunnel_to(struct Thing *creatng);
TbBool send_tunneller_to_point_in_dungeon(struct Thing *creatng, PlayerNumber plyr_idx, struct Coord3d *pos);
TbBool is_hero_tunnelling_to_attack(struct Thing *creatng);
struct Thing *script_process_new_tunneler(unsigned char plyr_idx, TbMapLocation location, TbMapLocation heading, unsigned char crtr_level, unsigned long carried_gold);
struct Thing *script_process_new_tunneler(unsigned char plyr_idx, TbMapLocation location, TbMapLocation heading, CrtrExpLevel exp_level, unsigned long carried_gold);
/******************************************************************************/
#ifdef __cplusplus
}
Expand Down
4 changes: 2 additions & 2 deletions src/creature_states_lair.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ CrStateRet creature_add_lair_to_room(struct Thing *creatng, struct Room *room)
lairtng->lair.belongs_to = creatng->index;
lairtng->lair.cssize = 1;
// Lair size depends on creature level
lairtng->lair.spr_size = game.conf.crtr_conf.sprite_size + (game.conf.crtr_conf.sprite_size * game.conf.crtr_conf.exp.size_increase_on_exp * cctrl->explevel) / 100;
lairtng->lair.spr_size = game.conf.crtr_conf.sprite_size + (game.conf.crtr_conf.sprite_size * game.conf.crtr_conf.exp.size_increase_on_exp * cctrl->exp_level) / 100;
lairtng->move_angle_xy = CREATURE_RANDOM(creatng, 2*LbFPMath_PI);
struct ObjectConfigStats* objst = get_object_model_stats(lairtng->model);
unsigned long i = convert_td_iso(objst->sprite_anim_idx);
Expand Down Expand Up @@ -534,7 +534,7 @@ short creature_sleep(struct Thing *thing)
{
if (((game.play_gameturn + thing->index) % game.conf.rules.creature.recovery_frequency) == 0)
{
HitPoints recover = compute_creature_max_health(crstat->sleep_recovery, cctrl->explevel);
HitPoints recover = compute_creature_max_health(crstat->sleep_recovery, cctrl->exp_level);
apply_health_to_thing_and_display_health(thing, recover);
}
}
Expand Down
Loading