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
20 changed files with 78 additions and 251 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

@@ -11,4 +11,3 @@
Gods Gods
~~~~ ~~~~
kyonshi

View File

@@ -1,17 +0,0 @@
#4900
boards bulletin gen_boards~
a bulletin board~
A small bulletin board is mounted on a wall here.~
~
13 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 0 0 0
E
bulletin~
Use 'look board' to read the board.
~
E
board~
If you can read this, the board is not working.
~
$

View File

@@ -38,7 +38,6 @@
44.obj 44.obj
45.obj 45.obj
46.obj 46.obj
49.obj
50.obj 50.obj
51.obj 51.obj
52.obj 52.obj

View File

@@ -637,17 +637,10 @@ You see Poor Alley.
S S
#3026 #3026
The Dark Alley~ The Dark Alley~
The dark alley, to the west is the common square and to the south The dark alley, to the west is the common square and to the south is the
is the Guild of Thieves. The alley continues east. You see a curious Guild of Thieves. The alley continues east.
building to the north you swear wasn't here the last time you have
been to this dark alley.
~ ~
30 0 0 0 0 1 30 0 0 0 0 1
D0
This building wasn't here last time, right?
~
~
0 -1 49101
D1 D1
The alley continues east. The alley continues east.
~ ~

View File

@@ -1,10 +0,0 @@
#4900
In a Time and Place before Creation~
You are standing in the Void. Earth and Sky have not yet been
separated. Nothing has form here, except the Celestial Mound rising
above the shapeless waters of Nu. Could this be a time and place
before Creation?
~
49 ce 0 0 0 0
S
$

View File

@@ -1,131 +0,0 @@
#49100
The Common Room~
You are in the woodpaneled common room of the Grenzland Building.
People are talking quietly or reading in silence. There is a fire
crackling in the hearth to the North. To the West is a deserted bar.
To the South is the Entry Hall.
~
491 de 0 0 0 0
D2
You see the Entry Hall to the Grenzland Building.
~
~
1 -1 49101
E
note bar~
The note reads:
The bar is closed until I can figure out the format of .shp files.
- a.
~
S
#49101
The Entry Hall to the Grenzland Building~
You are in the Entry Hall to the Grenzland Building. To the North
you see the Common Room. To the East you see the Grenzland Shop. To
the South you see the Entry Hall. To the South is a Dark Alley in
Midgaard. To the West is a door with a small note pinned to it. A
double staircase leads up to the Balcony.
~
491 de 0 0 0 0
D0
You see the Common Room.
~
~
1 -1 49100
D1
You see the Grenzland Shop.
~
~
1 -1 49102
D2
You see a Dark Alley.
~
~
1 -1 3026
D4
You see the Balcony from below.
~
~
1 -1 49110
E
note~
The note reads:
This door will lead to a teleporter room in the future.
- a.
~
S
#49102
The Grenzland Shop~
You are in the Grenzland Shop. It looks deserted (for now). To
the West is the Common Room. There is a small note pinned to the
counter.
~
491 de 0 0 0 0
D3
You see the Entry Hall.
~
~
1 -1 49101
E
note~
The note reads:
The store is closed until I can figure out the format of .shp files.
- a.
~
S
#49110
The Balcony above the Entry Hall~
This is the Balcony above the Entry Hall To the North is the
Library. From the door to the East you hear busy typing. The door to
has a brass plaque on it. A double staircase leads down to the Entry
Hall.
~
491 de 0 0 0 0
D0
You see a double-winged door leading into the Library.
~
~
1 -1 49112
D1
You see a door with a brass plaque on it.
~
~
1 -1 49111
D5
You see the Entry Hall from above.
~
~
1 -1 49101
E
note plaque door~
The plaque reads: "Grenzland Zine Editorial Room"
~
S
#49111
The Grenzland Zine Editorial Room~
This is supposed to be the editorial room of the Grenzland Zine.
Dozens of monkeys chained to typwriters type frantically. This is a
joke, right?
~
491 de 0 0 0 0
D3
You see the Balcony above the Entry Hall.
~
~
1 -1 49110
S
#49112
The Library~
Not much to see here (for now).
~
491 de 0 0 0 0
D2
You see the Balcony above the Entry.
~
~
1 -1 49110
S
$

View File

@@ -38,7 +38,6 @@
44.wld 44.wld
45.wld 45.wld
46.wld 46.wld
49.wld
50.wld 50.wld
51.wld 51.wld
52.wld 52.wld
@@ -184,7 +183,6 @@
343.wld 343.wld
345.wld 345.wld
346.wld 346.wld
491.wld
555.wld 555.wld
556.wld 556.wld
653.wld 653.wld

View File

@@ -1,7 +0,0 @@
#49
GrenzlandMUD~
Grenzland~
4900 4999 15 2 d 0 0 0 1 33
S
$

View File

@@ -1,10 +0,0 @@
#491
GrenzlandMUD~
Grenzland Building~
49100 49199 15 2 d 0 0 0 1 33
R 0 49101 4900 -1 (a bulletin board)
O 0 4900 99 49101 (a bulletin board)
D 0 49110 1 1
D 0 49111 3 1
S
$

View File

@@ -38,7 +38,6 @@
44.zon 44.zon
45.zon 45.zon
46.zon 46.zon
49.zon
50.zon 50.zon
51.zon 51.zon
52.zon 52.zon
@@ -184,7 +183,6 @@
343.zon 343.zon
345.zon 345.zon
346.zon 346.zon
491.zon
555.zon 555.zon
556.zon 556.zon
653.zon 653.zon

View File

@@ -53,7 +53,6 @@ struct board_info_type board_info[NUM_OF_BOARDS] = {
{1226, 0, 0, LVL_IMPL, LIB_ETC "board.builder", 0}, {1226, 0, 0, LVL_IMPL, LIB_ETC "board.builder", 0},
{1227, 0, 0, LVL_IMPL, LIB_ETC "board.staff", 0}, {1227, 0, 0, LVL_IMPL, LIB_ETC "board.staff", 0},
{1228, 0, 0, LVL_IMPL, LIB_ETC "board.advertising", 0}, {1228, 0, 0, LVL_IMPL, LIB_ETC "board.advertising", 0},
{4900, 0, 0, LVL_IMMORT, LIB_ETC "board.grenzland", 0},
}; };
/* local (file scope) global variables */ /* local (file scope) global variables */

View File

@@ -13,7 +13,7 @@
#ifndef _BOARDS_H_ #ifndef _BOARDS_H_
#define _BOARDS_H_ #define _BOARDS_H_
#define NUM_OF_BOARDS 8 /* change if needed! */ #define NUM_OF_BOARDS 7 /* change if needed! */
#define MAX_BOARD_MESSAGES 60 /* arbitrary -- change if needed */ #define MAX_BOARD_MESSAGES 60 /* arbitrary -- change if needed */
#define MAX_MESSAGE_LENGTH 4096 /* arbitrary -- change if needed */ #define MAX_MESSAGE_LENGTH 4096 /* arbitrary -- change if needed */

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);

View File

@@ -136,7 +136,6 @@ void assign_objects(void)
ASSIGNOBJ(3097, gen_board); /* freeze board */ ASSIGNOBJ(3097, gen_board); /* freeze board */
ASSIGNOBJ(3098, gen_board); /* immortal board */ ASSIGNOBJ(3098, gen_board); /* immortal board */
ASSIGNOBJ(3099, gen_board); /* mortal board */ ASSIGNOBJ(3099, gen_board); /* mortal board */
ASSIGNOBJ(4900, gen_board); /* mortal board */
ASSIGNOBJ(115, bank); ASSIGNOBJ(115, bank);
ASSIGNOBJ(334, bank); /* atm */ ASSIGNOBJ(334, bank); /* atm */