Merge remote-tracking branch 'origin/master' into luciee

This commit is contained in:
Katherine Kiefer
2022-07-06 10:34:36 +10:00
34 changed files with 993 additions and 729 deletions

1
.github/CODEOWNERS vendored
View File

@@ -20,6 +20,7 @@
/html/templates/ @yogstation13/head-coders
/sound/ @yogstation13/head-coders
/yogstation/sound/ @yogstation13/head-coders
/yogstation/code/game/world.dm @yogstation13/head-coders
#Teams

View File

@@ -0,0 +1,124 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"b" = (
/turf/open/floor/wood,
/area/template_noop)
"d" = (
/turf/open/water/safe,
/area/template_noop)
"e" = (
/obj/machinery/vending/fishing,
/turf/open/floor/wood,
/area/template_noop)
"g" = (
/obj/effect/turf_decal/pool/corner{
dir = 1
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/template_noop)
"h" = (
/obj/effect/turf_decal/pool,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/template_noop)
"k" = (
/obj/effect/turf_decal/pool/corner{
dir = 8
},
/turf/open/floor/wood,
/area/template_noop)
"l" = (
/obj/effect/turf_decal/pool{
dir = 4
},
/obj/machinery/light{
dir = 8
},
/turf/open/floor/wood,
/area/template_noop)
"p" = (
/obj/effect/turf_decal/pool,
/turf/open/floor/wood,
/area/template_noop)
"q" = (
/obj/effect/turf_decal/pool/corner,
/obj/effect/spawner/lootdrop/trashbin{
pixel_x = -2;
pixel_y = -7
},
/turf/open/floor/wood,
/area/template_noop)
"I" = (
/obj/effect/turf_decal/pool{
dir = 1
},
/turf/open/floor/wood,
/area/template_noop)
"J" = (
/obj/machinery/light{
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/vomit/old,
/turf/open/floor/wood,
/area/template_noop)
"N" = (
/obj/effect/turf_decal/pool{
dir = 8
},
/obj/structure/chair/stool/bamboo,
/obj/item/twohanded/fishingrod{
pixel_x = -6;
pixel_y = 7
},
/obj/item/reagent_containers/food/snacks/fish/goldfish{
bitecount = 0;
length = 1;
pixel_x = 7;
pixel_y = 9;
weight = 2
},
/turf/open/floor/wood,
/area/template_noop)
"R" = (
/obj/effect/turf_decal/pool{
dir = 1
},
/obj/effect/spawner/lootdrop/maintenance{
pixel_x = -7;
pixel_y = -7
},
/turf/open/floor/wood,
/area/template_noop)
"Y" = (
/obj/effect/turf_decal/pool/corner{
dir = 4
},
/turf/open/floor/wood,
/area/template_noop)
(1,1,1) = {"
q
l
g
"}
(2,1,1) = {"
h
d
I
"}
(3,1,1) = {"
p
d
R
"}
(4,1,1) = {"
Y
N
k
"}
(5,1,1) = {"
e
J
b
"}

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/open/space,
/area/space)
/turf/template_noop,
/area/template_noop)
"ab" = (
/obj/machinery/door/airlock/shuttle{
name = "cargo bay";
@@ -92,6 +92,9 @@
"al" = (
/obj/structure/closet/emcloset,
/obj/effect/decal/cleanable/dirt,
/obj/item/pen,
/obj/item/pen,
/obj/item/pen,
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"am" = (
@@ -309,7 +312,9 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"aN" = (
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/miner,
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/miner{
dir = 8
},
/turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned)
"aO" = (
@@ -679,6 +684,12 @@
"fw" = (
/obj/structure/table,
/obj/item/storage/photo_album,
/obj/item/paper/crumpled{
inertia_dir = 0;
info = "It was bugging me that we didn't have pens, so I looted a ruin for some more. They're in the emergency closet. -E";
pixel_x = 1;
pixel_y = 6
},
/turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned)
"gv" = (
@@ -886,7 +897,7 @@
height = 15;
id = "whiteship";
launch_status = 0;
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
movement_force = list("KNOCKDOWN"=0,"THROW"=0);
name = "Free Miner Ship";
port_direction = 8;
preferred_direction = 4;
@@ -905,7 +916,9 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/abandoned)
"pP" = (
/obj/machinery/computer/shuttle/white_ship/miner,
/obj/machinery/computer/shuttle/white_ship/miner{
dir = 8
},
/turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned)
"qA" = (
@@ -1055,6 +1068,7 @@
pixel_x = -1;
pixel_y = 2
},
/obj/item/pen/fountain,
/turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned)
"Fj" = (

View File

@@ -44,10 +44,10 @@
return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user))
/mob/living/attackby(obj/item/I, mob/living/user, params)
var/dist = get_dist(src,user)
if(..())
return TRUE
var/dist = get_dist(src,user)
user.changeNext_move(CLICK_CD_MELEE * I.weapon_stats[SWING_SPEED] * (I.range_cooldown_mod ? (dist > 0 ? dist * I.range_cooldown_mod : I.range_cooldown_mod) : 1)) //range increases attack cooldown by swing speed
user.changeNext_move(CLICK_CD_MELEE * I.weapon_stats[SWING_SPEED] * (I.range_cooldown_mod ? (dist > 0 ? min(dist, I.weapon_stats[REACH]) * I.range_cooldown_mod : I.range_cooldown_mod) : 1)) //range increases attack cooldown by swing speed
user.weapon_slow(I)
if(user.a_intent == INTENT_HARM && stat == DEAD && (butcher_results || guaranteed_butcher_results)) //can we butcher it?
var/datum/component/butchering/butchering = I.GetComponent(/datum/component/butchering)
@@ -110,7 +110,7 @@
if(item_flags & NOBLUDGEON)
return
var/dist = get_dist(O,user)
user.changeNext_move(CLICK_CD_MELEE * weapon_stats[SWING_SPEED] * (range_cooldown_mod ? (dist > 0 ? dist * range_cooldown_mod : range_cooldown_mod) : 1)) //range increases attack cooldown by swing speed
user.changeNext_move(CLICK_CD_MELEE * weapon_stats[SWING_SPEED] * (range_cooldown_mod ? (dist > 0 ? min(dist, weapon_stats[REACH]) * range_cooldown_mod : range_cooldown_mod) : 1)) //range increases attack cooldown by swing speed
user.do_attack_animation(O)
O.attacked_by(src, user)
user.weapon_slow(src)

View File

@@ -66,7 +66,7 @@ SUBSYSTEM_DEF(demo)
/datum/controller/subsystem/demo/Initialize()
WRITE_LOG_NO_FORMAT(GLOB.demo_log, "demo version 1\n") // increment this if you change the format
if(GLOB.revdata)
WRITE_LOG_NO_FORMAT(GLOB.demo_log, "commit [GLOB.revdata.originmastercommit || GLOB.revdata.commit]\n")
WRITE_LOG_NO_FORMAT(GLOB.demo_log, "commit [GLOB.revdata.commit || GLOB.revdata.originmastercommit]\n")
// write a "snapshot" of the world at this point.
// start with turfs

View File

@@ -58,15 +58,15 @@
var/time_required = 0 // Framework for future setting of required time for antag roles
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
/// Shows the gamemode's name and a fast description.
/datum/game_mode/proc/announce()
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
to_chat(world, "<b>[announce_text]</b>")
/datum/game_mode/proc/admin_panel()
return
///Checks to see if the game can be setup and ran with the current number of players or whatnot.
/// Checks to see if the game can be setup and ran with the current number of players or whatnot.
/datum/game_mode/proc/can_start()
var/playerC = 0
var/unreadiedPlayers = 0
@@ -90,9 +90,9 @@
return TRUE
///Attempts to select players for special roles the mode might have.
/// Attempts to select players for special roles the mode might have.
/datum/game_mode/proc/pre_setup()
return 1
return TRUE
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report.
@@ -131,17 +131,17 @@
addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
generate_station_goals()
gamemode_ready = TRUE
return 1
return TRUE
///Handles late-join antag assignments
/// Handles late-join antag assignments
/datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character)
if(replacementmode && round_converted == 2)
replacementmode.make_antag_chance(character)
return
///Allows rounds to basically be "rerolled" should the initial premise fall through. Also known as mulligan antags.
/// Allows rounds to basically be "rerolled" should the initial premise fall through. Also known as mulligan antags.
/datum/game_mode/proc/convert_roundtype()
set waitfor = FALSE
var/list/living_crew = list()
@@ -170,10 +170,10 @@
switch(SSshuttle.emergency.mode) //Rounds on the verge of ending don't get new antags, they just run out
if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE)
return 1
return TRUE
if(SHUTTLE_CALL)
if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergencyCallTime)*0.5)
return 1
return TRUE
var/matc = CONFIG_GET(number/midround_antag_time_check)
if(world.time >= (matc * 600))
@@ -210,7 +210,7 @@
//somewhere between 1 and 3 minutes from now
if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag])
round_converted = 0
return 1
return TRUE
for(var/mob/living/carbon/human/H in antag_candidates)
if(H.client)
replacementmode.make_antag_chance(H)
@@ -219,16 +219,17 @@
message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --")
///Called by the gameSSticker
/// Called by the SSticker fires every second
/datum/game_mode/process()
return 0
return FALSE
//For things that do not die easily
/// For things that do not die easily
/datum/game_mode/proc/are_special_antags_dead()
return TRUE
/datum/game_mode/proc/check_finished(force_ending) //to be called by SSticker
/// Determines if a gamemode should end the round
/datum/game_mode/proc/check_finished(force_ending)
if(!SSticker.setup_done || !gamemode_ready)
return FALSE
if(replacementmode && round_converted == 2)
@@ -245,45 +246,45 @@
if(Player.mind)
if(Player.mind.special_role || LAZYLEN(Player.mind.antag_datums))
continuous_sanity_checked = 1
return 0
return FALSE
if(!continuous_sanity_checked)
message_admins("The roundtype ([config_tag]) has no antagonists, continuous round has been defaulted to on and midround_antag has been defaulted to off.")
continuous[config_tag] = TRUE
midround_antag[config_tag] = FALSE
SSshuttle.clearHostileEnvironment(src)
return 0
return FALSE
if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player) && (living_antag_player.mind.special_role || LAZYLEN(living_antag_player.mind.antag_datums)))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
return FALSE //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in GLOB.alive_mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client && (Player.mind.special_role || LAZYLEN(Player.mind.antag_datums))) //Someone's still antagging but is their antagonist datum important enough to skip mulligan?
for(var/datum/antagonist/antag_types in Player.mind.antag_datums)
if(antag_types.prevent_roundtype_conversion)
living_antag_player = Player //they were an important antag, they're our new mark
return 0
return FALSE
if(!are_special_antags_dead())
return FALSE
if(!continuous[config_tag] || force_ending)
return 1
return TRUE
else
round_converted = convert_roundtype()
if(!round_converted)
if(round_ends_with_antag_death)
return 1
return TRUE
else
midround_antag[config_tag] = 0
return 0
return FALSE
return 0
return FALSE
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
return 0
// Checks if the antags have won
/datum/game_mode/proc/check_win()
return FALSE
/datum/game_mode/proc/send_intercept()
var/intercepttext = "<b><i>Central Command Status Summary</i></b><hr>"
@@ -338,18 +339,19 @@
. += "[station_trait.get_report()]\n"
return
// This is a frequency selection system. You may imagine it like a raffle where each player can have some number of tickets. The more tickets you have the more likely you are to
// "win". The default is 100 tickets. If no players use any extra tickets (earned with the antagonist rep system) calling this function should be equivalent to calling the normal
// pick() function. By default you may use up to 100 extra tickets per roll, meaning at maximum a player may double their chances compared to a player who has no extra tickets.
//
// The odds of being picked are simply (your_tickets / total_tickets). Suppose you have one player using fifty (50) extra tickets, and one who uses no extra:
// Player A: 150 tickets
// Player B: 100 tickets
// Total: 250 tickets
//
// The odds become:
// Player A: 150 / 250 = 0.6 = 60%
// Player B: 100 / 250 = 0.4 = 40%
/* This is a frequency selection system. You may imagine it like a raffle where each player can have some number of tickets. The more tickets you have the more likely you are to
* "win". The default is 100 tickets. If no players use any extra tickets (earned with the antagonist rep system) calling this function should be equivalent to calling the normal
* pick() function. By default you may use up to 100 extra tickets per roll, meaning at maximum a player may double their chances compared to a player who has no extra tickets.
*
* The odds of being picked are simply (your_tickets / total_tickets). Suppose you have one player using fifty (50) extra tickets, and one who uses no extra:
* Player A: 150 tickets
* Player B: 100 tickets
* Total: 250 tickets
*
* The odds become:
* Player A: 150 / 250 = 0.6 = 60%
* Player B: 100 / 250 = 0.4 = 40%
*/
/datum/game_mode/proc/antag_pick(list/datum/candidates)
if(GLOB.antag_token_users.len >= 1) //Antag token users get first priority, no matter their preferences
var/client/C = pick_n_take(GLOB.antag_token_users)
@@ -520,30 +522,30 @@
print_command_report(suicide_command_report, "Central Command Personnel Update")
/datum/game_mode/proc/get_living_by_department(var/department)
/// Gets all living crewmembers for a department
/datum/game_mode/proc/get_living_by_department(department)
. = list()
for(var/mob/living/carbon/human/player in GLOB.mob_list)
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in department))
. |= player.mind
/datum/game_mode/proc/get_all_by_department(var/department)
/// Gets all crewmembers for a department including dead ones
/datum/game_mode/proc/get_all_by_department(department)
. = list()
for(var/mob/player in GLOB.mob_list)
if(player.mind && (player.mind.assigned_role in department))
. |= player.mind
/////////////////////////////////////////////
//Keeps track of all living silicon members//
/////////////////////////////////////////////
/// Gets all living silicon members
/datum/game_mode/proc/get_living_silicon()
. = list()
for(var/mob/living/silicon/player in GLOB.mob_list)
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.nonhuman_positions))
. |= player.mind
///////////////////////////////////////
//Keeps track of all silicon members //
///////////////////////////////////////
/// Gets all silicon members including dead ones
/datum/game_mode/proc/get_all_silicon()
. = list()
for(var/mob/living/silicon/player in GLOB.mob_list)
@@ -611,13 +613,14 @@
for (var/C in GLOB.admins)
to_chat(C, msg.Join())
log_admin(msg.Join())
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/// If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/datum/game_mode/proc/age_check(client/C)
if(get_remaining_days(C) == 0)
return 1 //Available in 0 days = available right now = player is old enough to play.
return 0
return TRUE //Available in 0 days = available right now = player is old enough to play.
return FALSE
/// Returns the numbers of days before the player can access a specific role
/datum/game_mode/proc/get_remaining_days(client/C)
if(!C)
return 0
@@ -630,6 +633,7 @@
return max(0, enemy_minimum_age - C.player_age)
/// Used to remove antag status on borging for some gamemodes
/datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie)
SSticker.mode.remove_cultist(newborgie, 0, 0)
var/datum/antagonist/rev/rev = newborgie.has_antag_datum(/datum/antagonist/rev)
@@ -656,7 +660,7 @@
/datum/game_mode/proc/special_report()
return
//Set result and news report here
/// Set the round results
/datum/game_mode/proc/set_round_result()
SSticker.mode_result = "undefined"
if(station_was_nuked)

View File

@@ -86,6 +86,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cig.attackby(src, user)
else
cig.light(span_notice("[user] holds [src] out for [M], and lights [cig]."))
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
else
..()
@@ -289,6 +290,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cig.attackby(src, user)
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name]."))
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
else
return ..()
@@ -583,6 +585,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/lighter/ignition_effect(atom/A, mob/user)
if(is_hot())
. = span_rose("With a single flick of [user.p_their()] wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool.")
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
/obj/item/lighter/proc/set_lit(new_lit)
lit = new_lit
@@ -610,6 +613,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_lit(TRUE)
if(fancy)
user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement."))
playsound(src, 'sound/items/lighter/strike.ogg', 50, 2)
else
var/prot = FALSE
var/mob/living/carbon/human/H = user
@@ -623,6 +627,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(prot || prob(75))
user.visible_message("After a few attempts, [user] manages to light [src].", span_notice("After a few attempts, you manage to light [src]."))
playsound(src, 'sound/items/lighter/plastic_strike.ogg', 40, 2)
else
var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND
user.apply_damage(5, BURN, hitzone)
@@ -633,8 +638,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_lit(FALSE)
if(fancy)
user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.", span_notice("You quietly shut off [src] without even looking at what you're doing. Wow."))
playsound(src, 'sound/items/lighter/close.ogg', 50, 1)
else
user.visible_message("[user] quietly shuts off [src].", span_notice("You quietly shut off [src]."))
playsound(src, 'sound/items/lighter/plastic_close.ogg', 40, 2)
else
. = ..()
@@ -651,8 +658,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
if(fancy)
cig.light(span_rose("[user] whips the [name] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with."))
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name]."))
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
else
..()
@@ -710,6 +719,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user)
if(is_hot())
. = span_notice("After some fiddling, [user] manages to light [A] with [src].")
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
/obj/item/lighter/slime

View File

@@ -167,25 +167,22 @@
if(H.dna.species.use_skintones)
var/new_s_tone = input(user, "Choose your skin tone:", "Race change") as null|anything in GLOB.skin_tones
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
if(new_s_tone)
H.skin_tone = new_s_tone
H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK)
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(new_s_tone)
H.skin_tone = new_s_tone
H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK)
if((MUTCOLORS in H.dna.species.species_traits) && !(NOCOLORCHANGE in H.dna.species.species_traits))
var/new_mutantcolor = input(user, "Choose your skin color:", "Race change","#"+H.dna.features["mcolor"]) as color|null
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
H.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
H.dna.features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
to_chat(H, span_notice("Invalid color. Your color is not bright enough."))
else
to_chat(H, span_notice("Invalid color. Your color is not bright enough."))
H.update_body()
H.update_hair()

View File

@@ -188,10 +188,9 @@
else
if(recipient.holder)
if(holder)
to_chat(recipient,
type = MESSAGE_TYPE_ADMINPM,
html = span_danger("Admin PM from-<b>[key_name(src, recipient, 1)]</b>: [span_linkify("[keywordparsedmsg]")]"),
confidential = TRUE)
to_chat(recipient, "<font color='red' size='4'><b>-- Administrator private message --</b></font>", confidential=TRUE)
to_chat(recipient, span_adminsay("Admin PM from-<b>[key_name(src, recipient, 0)]</b>: [span_linkify("[msg]")]"), confidential=TRUE)
to_chat(recipient, span_adminsay("<i>Click on the administrator's name to reply.</i>"), confidential=TRUE)
to_chat(src,
type = MESSAGE_TYPE_ADMINPM,
html = span_notice("Admin PM to-<b>[key_name(recipient, src, 1)]</b>: [span_linkify("[keywordparsedmsg]")]"),

View File

@@ -306,6 +306,8 @@
if(factory)
factory.naut = null //remove this naut from its factory
factory.max_integrity = initial(factory.max_integrity)
if(overmind)
to_chat(overmind, "<font color=\"#EE4000\">[src] has died in [get_area(src)]!</font>")
flick("blobbernaut_death", src)
/mob/living/simple_animal/hostile/blob/blobbernaut/independent

View File

@@ -133,7 +133,7 @@ Contains:
/obj/item/clothing/suit/space/pirate
name = "syndicate pirate coat"
desc = "Argh! The standard armor of freelance forces contracted by the Syndicate to terrorize and disrupt commercial operations."
desc = "Arrrgh! The standard armor of freelance forces contracted by the Syndicate to terrorize and disrupt commercial operations."
icon_state = "pirate"
item_state = "pirate"
w_class = WEIGHT_CLASS_NORMAL
@@ -146,7 +146,7 @@ Contains:
/obj/item/clothing/suit/space/pirate/captain
name = "syndicate pirate captain coat"
desc = "Argh! Adorned with immeasurable protection, this coat serves the most fearsome Syndicate pirates in their neverending quest of loot."
desc = "Arrrgh! Adorned with immeasurable protection, this coat serves the most fearsome Syndicate pirates in their neverending quest of loot."
armor = list(MELEE = 40, BULLET = 60, LASER = 40, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, WOUND = 10)
resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "hgpirate"

View File

@@ -365,30 +365,38 @@
filling_color = "#B22222"
foodtype = MEAT
tastes = list("meat" = 1)
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet
slices_num = 3
juice_results = list(/datum/reagent/consumable/drippings = 15)
burns_on_grill = TRUE
/obj/item/reagent_containers/food/snacks/meat/steak/plain
foodtype = MEAT
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/meat/steak/plain/human
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain/human
tastes = list("tender meat" = 1)
foodtype = MEAT | GROSS
/obj/item/reagent_containers/food/snacks/meat/steak/killertomato
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/killertomato
name = "killer tomato steak"
tastes = list("tomato" = 1)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/meat/steak/bear
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/bear
name = "bear steak"
tastes = list("meat" = 1, "salmon" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/xeno
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno
name = "xeno steak"
tastes = list("meat" = 1, "acid" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/spider
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/spider
name = "spider steak"
tastes = list("cobwebs" = 1)
@@ -402,15 +410,18 @@
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/meat/steak/gondola
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/gondola
name = "gondola steak"
tastes = list("meat" = 1, "tranquility" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/penguin
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet/penguin
name = "penguin steak"
icon_state = "birdsteak"
tastes = list("beef" = 1, "cod fish" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/plain/human/lizard
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet
name = "lizard steak"
icon_state = "birdsteak"
tastes = list("juicy chicken" = 3, "scales" = 1)
@@ -422,6 +433,7 @@
tastes = list("enhanced char" = 2, "suspicious tenderness" = 2, "natural & artificial dyes" = 2, "emulsifying agents" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/synth
slice_path = /obj/item/reagent_containers/food/snacks/meat/cutlet
name = "synthsteak"
desc = "A synthetic meat steak. It doesn't look quite right, now does it?"
icon_state = "meatsteak_old"

View File

@@ -7,6 +7,10 @@
update_icons()
status_flags |= CANPUSH
for(var/mob/S in GLOB.player_list)
if(!S.stat && S.hivecheck())
to_chat(S, span_alien("You sense through your hivemind that [src] has died."))
//When the alien queen dies, all others must pay the price for letting her die.
/mob/living/carbon/alien/humanoid/royal/queen/death(gibbed)
if(stat == DEAD)

View File

@@ -1,3 +1,5 @@
GLOBAL_VAR_INIT(permadeath, FALSE)
/mob/living/gib(no_brain, no_organs, no_bodyparts)
var/prev_lying = lying
if(stat != DEAD)
@@ -89,4 +91,7 @@
var/datum/soullink/S = s
S.sharerDies(gibbed)
if(GLOB.permadeath)
ghostize(FALSE)
return TRUE

View File

@@ -102,6 +102,8 @@
if(!.)
return
var/turf/T = get_turf(owner)
if(!T)
return
var/loot = rand(1,100)
switch(loot)
if(1 to 5)
@@ -147,6 +149,9 @@
. = ..()
if(!.)
return
if(!isopenturf(owner.loc))
to_chat(owner,"<span class='warning'>You can't use raise soldiers while in an object!</span>")
return
var/cap = CONFIG_GET(number/ratcap)
var/something_from_nothing = FALSE
for(var/mob/living/simple_animal/mouse/M in oview(owner, 5))
@@ -188,6 +193,8 @@
/datum/action/cooldown/domain/proc/domain()
var/turf/T = get_turf(owner)
if(!T)
return
T.atmos_spawn_air("miasma=4;TEMP=[T20C]")
switch (rand(1,10))
if (8)

View File

@@ -16,9 +16,9 @@
/obj/item/ammo_casing/energy/plasma/scatter
projectile_type = /obj/item/projectile/plasma/scatter
delay = 15
e_cost = 70
pellets = 5
variance = 25
e_cost = 35
pellets = 6
variance = 30
/obj/item/ammo_casing/energy/plasma/scatter/adv
projectile_type = /obj/item/projectile/plasma/scatter/adv

View File

@@ -1,6 +1,6 @@
/obj/item/ammo_box/a357
name = "speed loader (.357)"
desc = "Designed to quickly reload revolvers."
desc = "A seven-shot speed loader designed for .357 revolvers."
icon_state = "357"
ammo_type = /obj/item/ammo_casing/a357
max_ammo = 7
@@ -8,7 +8,7 @@
/obj/item/ammo_box/c38
name = "speed loader (.38)"
desc = "Designed to quickly reload revolvers."
desc = "A six-shot speed loader designed for .38 revolvers."
icon_state = "38"
ammo_type = /obj/item/ammo_casing/c38
max_ammo = 6
@@ -17,17 +17,20 @@
/obj/item/ammo_box/c38/trac
name = "speed loader (.38 TRAC)"
desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body."
desc = "A six-shot speed loader designed for .38 revolvers. \
These rounds deal lessened damage and stopping power, but inject a tracking implant upon burrowing into a target's body. Implant lifespan is fifteen minutes."
ammo_type = /obj/item/ammo_casing/c38/trac
/obj/item/ammo_box/c38/hotshot
name = "speed loader (.38 Hot Shot)"
desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload."
desc = "A six-shot speed loader designed for .38 revolvers. \
These rounds trade exhaustive properties for an incendiary payload which sets targets ablaze."
ammo_type = /obj/item/ammo_casing/c38/hotshot
/obj/item/ammo_box/c38/iceblox
name = "speed loader (.38 Iceblox)"
desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload."
desc = "A six-shot speed loader designed for .38 revolvers. \
These rounds trade exhaustive properties for a cryogenic payload which significantly reduces the body temperature of targets hit."
ammo_type = /obj/item/ammo_casing/c38/iceblox
/obj/item/ammo_box/c9mm

View File

@@ -37,18 +37,20 @@
/obj/item/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail
name = ".38 Hot Shot bullet"
damage = 20
damage = 15
stamina = 0
/obj/item/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE)
. = ..()
if(iscarbon(target))
var/mob/living/carbon/M = target
M.adjust_fire_stacks(6)
M.adjust_fire_stacks(2)
M.IgniteMob()
/obj/item/projectile/bullet/c38/iceblox //see /obj/item/projectile/temp for the original code
name = ".38 Iceblox bullet"
damage = 20
damage = 15
stamina = 0
var/temperature = 100
/obj/item/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE)

View File

@@ -1254,7 +1254,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = rgb(51, 19, 3) //Sickly brown
boozepwr = 300 //I warned you
taste_description = "a wall of bricks"
glass_icon_state = "glass_brown2"
glass_icon_state = "bacchus"
glass_name = "Bacchus' Blessing"
glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?"

View File

@@ -34,11 +34,12 @@ endmap
map kilostation
maxplayers 40
votable
disabled
endmap
map gaxstation
maxplayers 30
votable
endmap
map icebox

View File

@@ -58,6 +58,72 @@
-->
<div class="commit sansserif">
<h2 class="date">05 July 2022</h2>
<h3 class="author">VaelophisNyx updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a new 5x3 maint ruin theme'd around fishing</li>
</ul>
<h2 class="date">04 July 2022</h2>
<h3 class="author">SomeguyManperson updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">your attack cooldown will no longer be set to actual real life minutes sometimes</li>
<li class="bugfix">melee weapons that theoretically have range will not theoretically always use their maximum range cooldown when attacking qdel on death mobs</li>
</ul>
<h2 class="date">02 July 2022</h2>
<h3 class="author"> SuperSlayer updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Regalrat now cannot use abilities while in a tube</li>
</ul>
<h3 class="author">Addust updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Free Miners now have pens.</li>
<li class="tweak">Free Miner ship console orientation is no longer braindead and the map file has passthroughs on the exterior.</li>
</ul>
<h3 class="author">AlvCyktor updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Sound FX</li>
<li class="tweak">sliceable steaks</li>
</ul>
<h3 class="author">JamieD1 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Replaces Kilo with GaxStation</li>
</ul>
<h3 class="author">Skrem7 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Syndicate pirate coat descriptions are now 36% more piratey.</li>
<li class="tweak">Makes it so experimental .38 does the same brute damage as standard .38, removes stamina damage</li>
<li class="tweak">Hotshot firestack application to 2 from 6</li>
</ul>
<h3 class="author">SomeguyManperson updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">pride's mirror may no longer just not curse people who use it</li>
</ul>
<h3 class="author">SuperSlayer updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Blob gets a message when a blobbernaut dies</li>
<li class="rscadd">Alliens get a message when a humanoid alien dies</li>
</ul>
<h3 class="author">ToasterBiome updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">kills psych on gaxstation</li>
<li class="bugfix">fixes bad areas on gaxstation</li>
<li class="tweak">adds more floor trim to gaxstation</li>
<li class="tweak">give virology airlock style airlocks on gaxstation</li>
</ul>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">fixed replays not showing test merged icons</li>
<li class="bugfix">fixed mhelps asking for your number</li>
</ul>
<h3 class="author">redmoogle updated:</h3>
<ul class="changes bgimages16">
<li class="imageadd">Bacchus Blessing has a sprite now</li>
<li class="tweak">Plasma Shotgun uses 1/2 energy</li>
<li class="tweak">Increase bullet count by 1 and increase variance slightly</li>
</ul>
<h2 class="date">01 July 2022</h2>
<h3 class="author">Mqiib updated:</h3>
<ul class="changes bgimages16">
@@ -2483,86 +2549,6 @@
<li class="tweak">Changes the message for chem spill, that no one has seen because it can't run because its broken</li>
<li class="rscadd">Added chem spill event</li>
</ul>
<h2 class="date">04 April 2022</h2>
<h3 class="author">SomeguyManperson updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">runtime fix</li>
<li class="bugfix">organ efficiency now calculates properly</li>
<li class="bugfix">escaping brazil no longer requires exactly 0 marbles, now accepts negative numbers</li>
</ul>
<h3 class="author">TheGamerdk updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">No more notification that the AI revamp is new</li>
</ul>
<h2 class="date">03 April 2022</h2>
<h3 class="author"> code by Chubbygummibear, sprites by Sheets updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">gives pod race hairstyle options</li>
<li class="imageadd">hairstyle sprites for pods</li>
<li class="imagedel">Phytosians no longer have brush built into their heads</li>
</ul>
<h3 class="author"> ynot01, maxion12345 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added the autopsy surgery, performed by detectives</li>
<li class="rscadd">Gave detective an autopsy room on boxstation with accompanying tutorial paper</li>
</ul>
<h3 class="author">00ze-cyclone updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">removed holograms, it's all hard light now.</li>
</ul>
<h3 class="author">LazennG updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added new pirate weapon: hand cannon</li>
</ul>
<h3 class="author">SapphicOverload updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">pda now starts in the id slot with the id inserted for most playable jobs.</li>
<li class="tweak">adds an option to the game preferences for whether you want this change or not.</li>
</ul>
<h3 class="author">Sniblet updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Amanitin and entropic polypnium also work for DNA recovery</li>
</ul>
<h3 class="author">SomeguyManperson updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">private server byond version maximum has been updated</li>
<li class="tweak">the wormhole jaunter will always activate when on your person if you fall into a chasm</li>
</ul>
<h3 class="author">ToasterBiome updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">closes murder loophole in silicon collective lawset</li>
</ul>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Nukies can no longer nuke themselves for a win</li>
</ul>
<h3 class="author">capsaicinz, Xoxeyos, arcturus-prime updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds supermatter spiders.</li>
</ul>
<h2 class="date">02 April 2022</h2>
<h3 class="author">TheGamerdk updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">AI data cores get a 45 tick grace period, up from 15 ticks</li>
<li class="rscadd">Admins can now right click AI Data Cores to VV the AIs inside</li>
<li class="bugfix">Station traits work again</li>
<li class="tweak">When a data core has failed/is failing the AI can now jump directly to the it.</li>
</ul>
<h3 class="author">ToasterBiome updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds 1K, 5K, and 10K mining point transfer cards</li>
</ul>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Dead traitors can no longer shop with the syndicate</li>
</ul>
<h3 class="author">maxion12345 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a pipebomb for your IRA roleplay needs.</li>
</ul>
</div>
<b>GoonStation 13 Development Team</b>

View File

@@ -32396,3 +32396,46 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: Bone sword now huge, less block chance
- tweak: All claymores in ruins are now unique items in code, have updated description,
also damage/blockchance nerfed
2022-07-02:
' SuperSlayer':
- bugfix: Regalrat now cannot use abilities while in a tube
Addust:
- rscadd: Free Miners now have pens.
- tweak: Free Miner ship console orientation is no longer braindead and the map
file has passthroughs on the exterior.
AlvCyktor:
- rscadd: Sound FX
- tweak: sliceable steaks
JamieD1:
- rscadd: Replaces Kilo with GaxStation
Skrem7:
- bugfix: Syndicate pirate coat descriptions are now 36% more piratey.
- tweak: Makes it so experimental .38 does the same brute damage as standard .38,
removes stamina damage
- tweak: Hotshot firestack application to 2 from 6
SomeguyManperson:
- bugfix: pride's mirror may no longer just not curse people who use it
SuperSlayer:
- rscadd: Blob gets a message when a blobbernaut dies
- rscadd: Alliens get a message when a humanoid alien dies
ToasterBiome:
- rscdel: kills psych on gaxstation
- bugfix: fixes bad areas on gaxstation
- tweak: adds more floor trim to gaxstation
- tweak: give virology airlock style airlocks on gaxstation
adamsong:
- bugfix: fixed replays not showing test merged icons
- bugfix: fixed mhelps asking for your number
redmoogle:
- imageadd: Bacchus Blessing has a sprite now
- tweak: Plasma Shotgun uses 1/2 energy
- tweak: Increase bullet count by 1 and increase variance slightly
2022-07-04:
SomeguyManperson:
- bugfix: your attack cooldown will no longer be set to actual real life minutes
sometimes
- bugfix: melee weapons that theoretically have range will not theoretically always
use their maximum range cooldown when attacking qdel on death mobs
2022-07-05:
VaelophisNyx:
- rscadd: Added a new 5x3 maint ruin theme'd around fishing

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -781,6 +781,12 @@
suffix = "5x3_yogsmaintrpg.dmm"
name = "Maint yogsmaintrpg"
///Author: Vaelophis
/datum/map_template/ruin/station/maint/fivexthree/smallfish
id = "smallfish"
suffix = "5x3_smallfish.dmm"
name = "Maint smallfish"
///Author: Veeblefetzer
/datum/map_template/ruin/station/maint/fivexthree/podmin
id = "podmin"

View File

@@ -472,7 +472,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(initiator)
to_chat(initiator, msg, confidential=TRUE)
initiator.mentorhelp(name, 1)
initiator.mhelp(name, TRUE)
SSblackbox.record_feedback("tally", "ahelp_stats", 1, "MHelp")
msg = "Ticket [TicketHref("#[id]")] marked as MHelp by [key_name]"

View File

@@ -20,11 +20,14 @@
paycheck_department = ACCOUNT_MED
display_order = JOB_DISPLAY_ORDER_PSYCHIATRIST
changed_maps = list("OmegaStation")
changed_maps = list("OmegaStation","GaxStation")
/datum/job/psych/proc/OmegaStationChanges()
return TRUE
/datum/job/psych/proc/GaxStationChanges() // I'M SORRY
return TRUE
/datum/outfit/job/psych
name = "Psych"
jobtype = /datum/job/psych

View File

@@ -1,7 +1,9 @@
/client/verb/mentorhelp(msg as text, fromadmins as null|num)
/client/verb/mentorhelp(msg as text)
set category = "Mentor"
set name = "Mentorhelp"
mhelp(msg, FALSE)
/client/proc/mhelp(msg as text, fromadmins as num)
//clean the input msg
if(!msg) return
@@ -25,7 +27,7 @@
var/admininfo = "MENTORHELP:"
if(fromadmins)
admininfo = "MENTORHELP(From Admins):"
admininfo = "MENTORHELP (From Admins):"
var/show_char = CONFIG_GET(flag/mentors_mobname_only)
var/mentor_msg = "<span class='mentornotice purple'><b>[admininfo]</b> <b>[key_name_mentor(src, 1, 0, 1, show_char)]</b>: [msg]</span>"
log_mentor("[admininfo] [key_name_mentor(src, 0, 0, 0, 0)]: [msg]")

View File

@@ -48,7 +48,7 @@
if(is_mentor())
to_chat(src, "<font color='red'>Error: Mentor-PM: Client not found.</font>", confidential=TRUE)
else
mentorhelp(msg) //Mentor we are replying to left. Mentorhelp instead(check below)
mhelp(msg, FALSE) //Mentor we are replying to left. Mentorhelp instead(check below)
return
//get message text, limit it's length.and clean/escape html