3 Commits

Author SHA1 Message Date
Thomas Arp
a40e8d3f97 Find the correct corpse when autosplitting and sac-ing.
Fixes #147
2025-07-16 21:31:25 +02:00
Thomas Arp
56312d7fe6 kaizen ignore CLion Cmake files 2025-07-16 20:26:54 +02:00
Thomas Arp
670e2331fc kaizen remove removed file from util/CMakeLists.txt 2025-07-16 20:19:29 +02:00
8 changed files with 75 additions and 59 deletions

2
.gitignore vendored
View File

@@ -11,6 +11,8 @@ src/.accepted
src/depend src/depend
src/util/depend src/util/depend
build/* build/*
# generated by CLion
cmake-build-*
# Do not commit files from players # Do not commit files from players
lib/plrfiles/A-E/* lib/plrfiles/A-E/*

View File

@@ -1,3 +1,3 @@
Files for grenzland-mud, forked from tbamud Files for tbaMUD.

View File

@@ -1,10 +1,8 @@
(lib/text/background) (lib/text/background)
The mists part and you find yourself in a There once was a guy who played MUDs
world unlike the one you have just left. But the MUDs that he played were all duds
Reality twisted and turned, and the land "I'll write one," said he.
has found itself in a new configuration. And he brushed off his C.
Enter the borderland of reality and find And soon played his game with his buds.
your own way.
In the Grenzland.

View File

@@ -1,13 +1,7 @@
T B A M U D
2 0 2 5
G R E N Z L A N D M U D
2 0 2 6
Based on tbaMUD, by The Builder Academy
Based on CircleMUD by Jeremy Elson and DikuMUD by Hans-Henrik Staerfeldt, Based on CircleMUD by Jeremy Elson and DikuMUD by Hans-Henrik Staerfeldt,
Katja Nyboe, Tom Madsen, Michael Seifert, and Sebastian Hammer Katja Nyboe, Tom Madsen, Michael Seifert, and Sebastian Hammer
By what name do you wish to be known?
Oh hero, by what name shall you wish to be known?

View File

@@ -1,12 +1,8 @@
(lib/text/policies) (lib/text/policies)
Right now we are all adults and should be able to interact with This file should list, in no uncertain terms, the policies you must abide
each other without any larger issues. by on this MUD.
But the Grenzland maxim still is in force:
We are here to play, don't piss into anyone else's beer.
No harassing, no doxxing, no sexism, racism, or other unacceptable Bug the higher-ups to make some policies and write them in this file, lest
isms towards your fellow players. a political disaster ensue...
We definitely should add something more worked out in here.

View File

@@ -10,5 +10,4 @@
Gods Gods
~~~~ ~~~~
kyonshi

View File

@@ -56,7 +56,7 @@ static struct char_data *next_combat_list = NULL;
/* local file scope utility functions */ /* local file scope utility functions */
static void perform_group_gain(struct char_data *ch, int base, struct char_data *victim); static void perform_group_gain(struct char_data *ch, int base, struct char_data *victim);
static void dam_message(int dam, struct char_data *ch, struct char_data *victim, int w_type); static void dam_message(int dam, struct char_data *ch, struct char_data *victim, int w_type);
static void make_corpse(struct char_data *ch); static obj_data *make_corpse(struct char_data *ch);
static void change_alignment(struct char_data *ch, struct char_data *victim); static void change_alignment(struct char_data *ch, struct char_data *victim);
static void group_gain(struct char_data *ch, struct char_data *victim); static void group_gain(struct char_data *ch, struct char_data *victim);
static void solo_gain(struct char_data *ch, struct char_data *victim); static void solo_gain(struct char_data *ch, struct char_data *victim);
@@ -161,7 +161,7 @@ void stop_fighting(struct char_data *ch)
update_pos(ch); update_pos(ch);
} }
static void make_corpse(struct char_data *ch) static obj_data *make_corpse(struct char_data *ch)
{ {
char buf2[MAX_NAME_LENGTH + 64]; char buf2[MAX_NAME_LENGTH + 64];
struct obj_data *corpse, *o; struct obj_data *corpse, *o;
@@ -229,6 +229,7 @@ static void make_corpse(struct char_data *ch)
IS_CARRYING_W(ch) = 0; IS_CARRYING_W(ch) = 0;
obj_to_room(corpse, IN_ROOM(ch)); obj_to_room(corpse, IN_ROOM(ch));
return corpse;
} }
/* When ch kills victim */ /* When ch kills victim */
@@ -250,9 +251,10 @@ void death_cry(struct char_data *ch)
send_to_room(world[IN_ROOM(ch)].dir_option[door]->to_room, "Your blood freezes as you hear someone's death cry.\r\n"); send_to_room(world[IN_ROOM(ch)].dir_option[door]->to_room, "Your blood freezes as you hear someone's death cry.\r\n");
} }
void raw_kill(struct char_data * ch, struct char_data * killer) struct obj_data *raw_kill(struct char_data *ch, struct char_data *killer)
{ {
struct char_data *i; struct char_data *i;
obj_data *corpse;
if (FIGHTING(ch)) if (FIGHTING(ch))
stop_fighting(ch); stop_fighting(ch);
@@ -284,23 +286,24 @@ struct char_data *i;
update_pos(ch); update_pos(ch);
make_corpse(ch); corpse = make_corpse(ch);
extract_char(ch); extract_char(ch);
if (killer) { if (killer) {
autoquest_trigger_check(killer, NULL, NULL, AQ_MOB_SAVE); autoquest_trigger_check(killer, NULL, NULL, AQ_MOB_SAVE);
autoquest_trigger_check(killer, NULL, NULL, AQ_ROOM_CLEAR); autoquest_trigger_check(killer, NULL, NULL, AQ_ROOM_CLEAR);
} }
return corpse;
} }
void die(struct char_data * ch, struct char_data * killer) struct obj_data *die(struct char_data *ch, struct char_data *killer)
{ {
gain_exp(ch, -(GET_EXP(ch) / 2)); gain_exp(ch, -(GET_EXP(ch) / 2));
if (!IS_NPC(ch)) { if (!IS_NPC(ch)) {
REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_KILLER); REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_KILLER);
REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_THIEF); REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_THIEF);
} }
raw_kill(ch, killer); return raw_kill(ch, killer);
} }
static void perform_group_gain(struct char_data *ch, int base, static void perform_group_gain(struct char_data *ch, int base,
@@ -581,16 +584,54 @@ int skill_message(int dam, struct char_data *ch, struct char_data *vict,
return (0); return (0);
} }
static void perform_autohandling(char_data *ch, const char_data *victim, int local_gold, const obj_data *corpse_obj) {
char local_buf[256];
obj_data *i;
int count = 0, found = FALSE;
if (IN_ROOM(ch) == NOWHERE || ch == victim) {
return;
}
// find the last corpse in the room
for (i = world[IN_ROOM(ch)].contents; i ; i = i->next_content) {
if (is_name("corpse", i->name) && CAN_SEE_OBJ(ch, i)) {
count++;
}
if (i == corpse_obj) {
found = TRUE;
break; // stop looking
}
}
if (count == 0 || !found) {
return; // no corpse here - it may have been removed by some other method.
}
if (GROUP(ch) && local_gold > 0 && PRF_FLAGGED(ch, PRF_AUTOSPLIT) ) {
sprintf(local_buf,"all.coin %d.corpse", count);
do_get(ch, local_buf, 0, 0);
sprintf(local_buf,"%d", local_gold);
do_split(ch, local_buf, 0, 0);
} else if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOGOLD)) {
sprintf(local_buf,"all.coin %d.corpse", count);
do_get(ch, local_buf, 0, 0);
}
if (!IS_NPC(ch) && (ch != victim) && PRF_FLAGGED(ch, PRF_AUTOLOOT)) {
sprintf(local_buf,"all %d.corpse", count);
do_get(ch, local_buf, 0, 0);
}
if (IS_NPC(victim) && !IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOSAC)) {
sprintf(local_buf,"%d.corpse", count);
do_sac(ch, local_buf,0,0);
}
}
/* This function returns the following codes: /* This function returns the following codes:
* < 0 Victim died. * < 0 Victim died.
* = 0 No damage. * = 0 No damage.
* > 0 How much damage done. */ * > 0 How much damage done. */
int damage(struct char_data *ch, struct char_data *victim, int dam, int attacktype) int damage(struct char_data *ch, struct char_data *victim, int dam, int attacktype)
{ {
long local_gold = 0, happy_gold = 0; int local_gold = 0, happy_gold = 0;
char local_buf[256]; obj_data *corpse_obj;
struct char_data *tmp_char;
struct obj_data *corpse_obj;
if (GET_POS(victim) <= POS_DEAD) { if (GET_POS(victim) <= POS_DEAD) {
/* This is "normal"-ish now with delayed extraction. -gg 3/15/2001 */ /* This is "normal"-ish now with delayed extraction. -gg 3/15/2001 */
@@ -758,31 +799,15 @@ int damage(struct char_data *ch, struct char_data *victim, int dam, int attackty
if (IS_NPC(victim)) { if (IS_NPC(victim)) {
if ((IS_HAPPYHOUR) && (IS_HAPPYGOLD)) if ((IS_HAPPYHOUR) && (IS_HAPPYGOLD))
{ {
happy_gold = (long)(GET_GOLD(victim) * (((float)(HAPPY_GOLD))/(float)100)); happy_gold = (int)(GET_GOLD(victim) * (((float)(HAPPY_GOLD))/(float)100));
happy_gold = MAX(0, happy_gold); happy_gold = MAX(0, happy_gold);
increase_gold(victim, happy_gold); increase_gold(victim, happy_gold);
} }
local_gold = GET_GOLD(victim); local_gold = GET_GOLD(victim);
sprintf(local_buf,"%ld", (long)local_gold);
} }
die(victim, ch); corpse_obj = die(victim, ch);
if (GROUP(ch) && (local_gold > 0) && PRF_FLAGGED(ch, PRF_AUTOSPLIT) ) { perform_autohandling(ch, victim, local_gold, corpse_obj);
generic_find("corpse", FIND_OBJ_ROOM, ch, &tmp_char, &corpse_obj);
if (corpse_obj) {
do_get(ch, "all.coin corpse", 0, 0);
do_split(ch, local_buf, 0, 0);
}
/* need to remove the gold from the corpse */
} else if (!IS_NPC(ch) && (ch != victim) && PRF_FLAGGED(ch, PRF_AUTOGOLD)) {
do_get(ch, "all.coin corpse", 0, 0);
}
if (!IS_NPC(ch) && (ch != victim) && PRF_FLAGGED(ch, PRF_AUTOLOOT)) {
do_get(ch, "all corpse", 0, 0);
}
if (IS_NPC(victim) && !IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOSAC)) {
do_sac(ch,"corpse",0,0);
}
return (-1); return (-1);
} }
return (dam); return (dam);

View File

@@ -26,10 +26,12 @@ void check_killer(struct char_data *ch, struct char_data *vict);
int compute_armor_class(struct char_data *ch); int compute_armor_class(struct char_data *ch);
int damage(struct char_data *ch, struct char_data *victim, int dam, int attacktype); int damage(struct char_data *ch, struct char_data *victim, int dam, int attacktype);
void death_cry(struct char_data *ch); void death_cry(struct char_data *ch);
void die(struct char_data * ch, struct char_data * killer);
struct obj_data *die(struct char_data *ch, struct char_data *killer);
void hit(struct char_data *ch, struct char_data *victim, int type); void hit(struct char_data *ch, struct char_data *victim, int type);
void perform_violence(void); void perform_violence(void);
void raw_kill(struct char_data * ch, struct char_data * killer);
struct obj_data *raw_kill(struct char_data *ch, struct char_data *killer);
void set_fighting(struct char_data *ch, struct char_data *victim); void set_fighting(struct char_data *ch, struct char_data *victim);
int skill_message(int dam, struct char_data *ch, struct char_data *vict, int skill_message(int dam, struct char_data *ch, struct char_data *vict,
int attacktype); int attacktype);