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 /html/templates/ @yogstation13/head-coders
/sound/ @yogstation13/head-coders /sound/ @yogstation13/head-coders
/yogstation/sound/ @yogstation13/head-coders /yogstation/sound/ @yogstation13/head-coders
/yogstation/code/game/world.dm @yogstation13/head-coders
#Teams #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 //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = ( "aa" = (
/turf/open/space, /turf/template_noop,
/area/space) /area/template_noop)
"ab" = ( "ab" = (
/obj/machinery/door/airlock/shuttle{ /obj/machinery/door/airlock/shuttle{
name = "cargo bay"; name = "cargo bay";
@@ -92,6 +92,9 @@
"al" = ( "al" = (
/obj/structure/closet/emcloset, /obj/structure/closet/emcloset,
/obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt,
/obj/item/pen,
/obj/item/pen,
/obj/item/pen,
/turf/open/floor/mineral/titanium, /turf/open/floor/mineral/titanium,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"am" = ( "am" = (
@@ -309,7 +312,9 @@
/turf/open/floor/mineral/titanium, /turf/open/floor/mineral/titanium,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"aN" = ( "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, /turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"aO" = ( "aO" = (
@@ -679,6 +684,12 @@
"fw" = ( "fw" = (
/obj/structure/table, /obj/structure/table,
/obj/item/storage/photo_album, /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, /turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"gv" = ( "gv" = (
@@ -886,7 +897,7 @@
height = 15; height = 15;
id = "whiteship"; id = "whiteship";
launch_status = 0; launch_status = 0;
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); movement_force = list("KNOCKDOWN"=0,"THROW"=0);
name = "Free Miner Ship"; name = "Free Miner Ship";
port_direction = 8; port_direction = 8;
preferred_direction = 4; preferred_direction = 4;
@@ -905,7 +916,9 @@
/turf/open/floor/mineral/titanium, /turf/open/floor/mineral/titanium,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"pP" = ( "pP" = (
/obj/machinery/computer/shuttle/white_ship/miner, /obj/machinery/computer/shuttle/white_ship/miner{
dir = 8
},
/turf/open/floor/mineral/titanium/white, /turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"qA" = ( "qA" = (
@@ -1055,6 +1068,7 @@
pixel_x = -1; pixel_x = -1;
pixel_y = 2 pixel_y = 2
}, },
/obj/item/pen/fountain,
/turf/open/floor/mineral/titanium/white, /turf/open/floor/mineral/titanium/white,
/area/shuttle/abandoned) /area/shuttle/abandoned)
"Fj" = ( "Fj" = (

View File

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

View File

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

View File

@@ -58,15 +58,15 @@
var/time_required = 0 // Framework for future setting of required time for antag roles 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>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
to_chat(world, "<b>[announce_text]</b>") to_chat(world, "<b>[announce_text]</b>")
/datum/game_mode/proc/admin_panel() /datum/game_mode/proc/admin_panel()
return 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() /datum/game_mode/proc/can_start()
var/playerC = 0 var/playerC = 0
var/unreadiedPlayers = 0 var/unreadiedPlayers = 0
@@ -90,9 +90,9 @@
return TRUE 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() /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 ///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. /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)) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
generate_station_goals() generate_station_goals()
gamemode_ready = TRUE 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) /datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character)
if(replacementmode && round_converted == 2) if(replacementmode && round_converted == 2)
replacementmode.make_antag_chance(character) replacementmode.make_antag_chance(character)
return 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() /datum/game_mode/proc/convert_roundtype()
set waitfor = FALSE set waitfor = FALSE
var/list/living_crew = list() 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 switch(SSshuttle.emergency.mode) //Rounds on the verge of ending don't get new antags, they just run out
if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE) if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE)
return 1 return TRUE
if(SHUTTLE_CALL) if(SHUTTLE_CALL)
if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergencyCallTime)*0.5) if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergencyCallTime)*0.5)
return 1 return TRUE
var/matc = CONFIG_GET(number/midround_antag_time_check) var/matc = CONFIG_GET(number/midround_antag_time_check)
if(world.time >= (matc * 600)) if(world.time >= (matc * 600))
@@ -210,7 +210,7 @@
//somewhere between 1 and 3 minutes from now //somewhere between 1 and 3 minutes from now
if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag]) if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag])
round_converted = 0 round_converted = 0
return 1 return TRUE
for(var/mob/living/carbon/human/H in antag_candidates) for(var/mob/living/carbon/human/H in antag_candidates)
if(H.client) if(H.client)
replacementmode.make_antag_chance(H) 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! --") 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() /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() /datum/game_mode/proc/are_special_antags_dead()
return TRUE 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) if(!SSticker.setup_done || !gamemode_ready)
return FALSE return FALSE
if(replacementmode && round_converted == 2) if(replacementmode && round_converted == 2)
@@ -245,45 +246,45 @@
if(Player.mind) if(Player.mind)
if(Player.mind.special_role || LAZYLEN(Player.mind.antag_datums)) if(Player.mind.special_role || LAZYLEN(Player.mind.antag_datums))
continuous_sanity_checked = 1 continuous_sanity_checked = 1
return 0 return FALSE
if(!continuous_sanity_checked) 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.") 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 continuous[config_tag] = TRUE
midround_antag[config_tag] = FALSE midround_antag[config_tag] = FALSE
SSshuttle.clearHostileEnvironment(src) 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))) 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) 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? 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) for(var/datum/antagonist/antag_types in Player.mind.antag_datums)
if(antag_types.prevent_roundtype_conversion) if(antag_types.prevent_roundtype_conversion)
living_antag_player = Player //they were an important antag, they're our new mark living_antag_player = Player //they were an important antag, they're our new mark
return 0 return FALSE
if(!are_special_antags_dead()) if(!are_special_antags_dead())
return FALSE return FALSE
if(!continuous[config_tag] || force_ending) if(!continuous[config_tag] || force_ending)
return 1 return TRUE
else else
round_converted = convert_roundtype() round_converted = convert_roundtype()
if(!round_converted) if(!round_converted)
if(round_ends_with_antag_death) if(round_ends_with_antag_death)
return 1 return TRUE
else else
midround_antag[config_tag] = 0 midround_antag[config_tag] = 0
return 0 return FALSE
return 0 return FALSE
// Checks if the antags have won
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. /datum/game_mode/proc/check_win()
return 0 return FALSE
/datum/game_mode/proc/send_intercept() /datum/game_mode/proc/send_intercept()
var/intercepttext = "<b><i>Central Command Status Summary</i></b><hr>" var/intercepttext = "<b><i>Central Command Status Summary</i></b><hr>"
@@ -338,18 +339,19 @@
. += "[station_trait.get_report()]\n" . += "[station_trait.get_report()]\n"
return 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 /* 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 * "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. * 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: * 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 A: 150 tickets
// Player B: 100 tickets * Player B: 100 tickets
// Total: 250 tickets * Total: 250 tickets
// *
// The odds become: * The odds become:
// Player A: 150 / 250 = 0.6 = 60% * Player A: 150 / 250 = 0.6 = 60%
// Player B: 100 / 250 = 0.4 = 40% * Player B: 100 / 250 = 0.4 = 40%
*/
/datum/game_mode/proc/antag_pick(list/datum/candidates) /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 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) var/client/C = pick_n_take(GLOB.antag_token_users)
@@ -520,30 +522,30 @@
print_command_report(suicide_command_report, "Central Command Personnel Update") 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() . = list()
for(var/mob/living/carbon/human/player in GLOB.mob_list) for(var/mob/living/carbon/human/player in GLOB.mob_list)
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in department)) if(player.stat != DEAD && player.mind && (player.mind.assigned_role in department))
. |= player.mind . |= 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() . = list()
for(var/mob/player in GLOB.mob_list) for(var/mob/player in GLOB.mob_list)
if(player.mind && (player.mind.assigned_role in department)) if(player.mind && (player.mind.assigned_role in department))
. |= player.mind . |= player.mind
/////////////////////////////////////////////
//Keeps track of all living silicon members// /// Gets all living silicon members
/////////////////////////////////////////////
/datum/game_mode/proc/get_living_silicon() /datum/game_mode/proc/get_living_silicon()
. = list() . = list()
for(var/mob/living/silicon/player in GLOB.mob_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)) if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.nonhuman_positions))
. |= player.mind . |= player.mind
/////////////////////////////////////// /// Gets all silicon members including dead ones
//Keeps track of all silicon members //
///////////////////////////////////////
/datum/game_mode/proc/get_all_silicon() /datum/game_mode/proc/get_all_silicon()
. = list() . = list()
for(var/mob/living/silicon/player in GLOB.mob_list) for(var/mob/living/silicon/player in GLOB.mob_list)
@@ -611,13 +613,14 @@
for (var/C in GLOB.admins) for (var/C in GLOB.admins)
to_chat(C, msg.Join()) to_chat(C, msg.Join())
log_admin(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) /datum/game_mode/proc/age_check(client/C)
if(get_remaining_days(C) == 0) if(get_remaining_days(C) == 0)
return 1 //Available in 0 days = available right now = player is old enough to play. return TRUE //Available in 0 days = available right now = player is old enough to play.
return 0 return FALSE
/// Returns the numbers of days before the player can access a specific role
/datum/game_mode/proc/get_remaining_days(client/C) /datum/game_mode/proc/get_remaining_days(client/C)
if(!C) if(!C)
return 0 return 0
@@ -630,6 +633,7 @@
return max(0, enemy_minimum_age - C.player_age) 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) /datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie)
SSticker.mode.remove_cultist(newborgie, 0, 0) SSticker.mode.remove_cultist(newborgie, 0, 0)
var/datum/antagonist/rev/rev = newborgie.has_antag_datum(/datum/antagonist/rev) var/datum/antagonist/rev/rev = newborgie.has_antag_datum(/datum/antagonist/rev)
@@ -656,7 +660,7 @@
/datum/game_mode/proc/special_report() /datum/game_mode/proc/special_report()
return return
//Set result and news report here /// Set the round results
/datum/game_mode/proc/set_round_result() /datum/game_mode/proc/set_round_result()
SSticker.mode_result = "undefined" SSticker.mode_result = "undefined"
if(station_was_nuked) if(station_was_nuked)

View File

@@ -86,6 +86,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cig.attackby(src, user) cig.attackby(src, user)
else else
cig.light(span_notice("[user] holds [src] out for [M], and lights [cig].")) cig.light(span_notice("[user] holds [src] out for [M], and lights [cig]."))
playsound(src, 'sound/items/lighter/light.ogg', 50, 2)
else else
..() ..()
@@ -289,6 +290,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
cig.attackby(src, user) cig.attackby(src, user)
else else
cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name].")) 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 else
return ..() return ..()
@@ -583,6 +585,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/lighter/ignition_effect(atom/A, mob/user) /obj/item/lighter/ignition_effect(atom/A, mob/user)
if(is_hot()) 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.") . = 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) /obj/item/lighter/proc/set_lit(new_lit)
lit = new_lit lit = new_lit
@@ -610,6 +613,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_lit(TRUE) set_lit(TRUE)
if(fancy) 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.")) 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 else
var/prot = FALSE var/prot = FALSE
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
@@ -623,6 +627,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(prot || prob(75)) 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].")) 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 else
var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND 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) user.apply_damage(5, BURN, hitzone)
@@ -633,8 +638,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
set_lit(FALSE) set_lit(FALSE)
if(fancy) 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.")) 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 else
user.visible_message("[user] quietly shuts off [src].", span_notice("You quietly shut off [src].")) 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 else
. = ..() . = ..()
@@ -651,8 +658,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else else
if(fancy) 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.")) 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 else
cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name].")) 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 else
..() ..()
@@ -710,6 +719,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) /obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user)
if(is_hot()) if(is_hot())
. = span_notice("After some fiddling, [user] manages to light [A] with [src].") . = 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 /obj/item/lighter/slime

View File

@@ -167,17 +167,14 @@
if(H.dna.species.use_skintones) 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 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)) if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
if(new_s_tone) if(new_s_tone)
H.skin_tone = new_s_tone H.skin_tone = new_s_tone
H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) H.dna.update_ui_block(DNA_SKIN_TONE_BLOCK)
if((MUTCOLORS in H.dna.species.species_traits) && !(NOCOLORCHANGE in H.dna.species.species_traits)) 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 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)) if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
if(new_mutantcolor) if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor) var/temp_hsv = RGBtoHSV(new_mutantcolor)

View File

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

View File

@@ -306,6 +306,8 @@
if(factory) if(factory)
factory.naut = null //remove this naut from its factory factory.naut = null //remove this naut from its factory
factory.max_integrity = initial(factory.max_integrity) 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) flick("blobbernaut_death", src)
/mob/living/simple_animal/hostile/blob/blobbernaut/independent /mob/living/simple_animal/hostile/blob/blobbernaut/independent

View File

@@ -133,7 +133,7 @@ Contains:
/obj/item/clothing/suit/space/pirate /obj/item/clothing/suit/space/pirate
name = "syndicate pirate coat" 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" icon_state = "pirate"
item_state = "pirate" item_state = "pirate"
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
@@ -146,7 +146,7 @@ Contains:
/obj/item/clothing/suit/space/pirate/captain /obj/item/clothing/suit/space/pirate/captain
name = "syndicate pirate captain coat" 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) 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 resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "hgpirate" icon_state = "hgpirate"

View File

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

View File

@@ -7,6 +7,10 @@
update_icons() update_icons()
status_flags |= CANPUSH 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. //When the alien queen dies, all others must pay the price for letting her die.
/mob/living/carbon/alien/humanoid/royal/queen/death(gibbed) /mob/living/carbon/alien/humanoid/royal/queen/death(gibbed)
if(stat == DEAD) if(stat == DEAD)

View File

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

View File

@@ -102,6 +102,8 @@
if(!.) if(!.)
return return
var/turf/T = get_turf(owner) var/turf/T = get_turf(owner)
if(!T)
return
var/loot = rand(1,100) var/loot = rand(1,100)
switch(loot) switch(loot)
if(1 to 5) if(1 to 5)
@@ -147,6 +149,9 @@
. = ..() . = ..()
if(!.) if(!.)
return 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/cap = CONFIG_GET(number/ratcap)
var/something_from_nothing = FALSE var/something_from_nothing = FALSE
for(var/mob/living/simple_animal/mouse/M in oview(owner, 5)) for(var/mob/living/simple_animal/mouse/M in oview(owner, 5))
@@ -188,6 +193,8 @@
/datum/action/cooldown/domain/proc/domain() /datum/action/cooldown/domain/proc/domain()
var/turf/T = get_turf(owner) var/turf/T = get_turf(owner)
if(!T)
return
T.atmos_spawn_air("miasma=4;TEMP=[T20C]") T.atmos_spawn_air("miasma=4;TEMP=[T20C]")
switch (rand(1,10)) switch (rand(1,10))
if (8) if (8)

View File

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

View File

@@ -1,6 +1,6 @@
/obj/item/ammo_box/a357 /obj/item/ammo_box/a357
name = "speed loader (.357)" name = "speed loader (.357)"
desc = "Designed to quickly reload revolvers." desc = "A seven-shot speed loader designed for .357 revolvers."
icon_state = "357" icon_state = "357"
ammo_type = /obj/item/ammo_casing/a357 ammo_type = /obj/item/ammo_casing/a357
max_ammo = 7 max_ammo = 7
@@ -8,7 +8,7 @@
/obj/item/ammo_box/c38 /obj/item/ammo_box/c38
name = "speed loader (.38)" name = "speed loader (.38)"
desc = "Designed to quickly reload revolvers." desc = "A six-shot speed loader designed for .38 revolvers."
icon_state = "38" icon_state = "38"
ammo_type = /obj/item/ammo_casing/c38 ammo_type = /obj/item/ammo_casing/c38
max_ammo = 6 max_ammo = 6
@@ -17,17 +17,20 @@
/obj/item/ammo_box/c38/trac /obj/item/ammo_box/c38/trac
name = "speed loader (.38 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 ammo_type = /obj/item/ammo_casing/c38/trac
/obj/item/ammo_box/c38/hotshot /obj/item/ammo_box/c38/hotshot
name = "speed loader (.38 Hot Shot)" 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 ammo_type = /obj/item/ammo_casing/c38/hotshot
/obj/item/ammo_box/c38/iceblox /obj/item/ammo_box/c38/iceblox
name = "speed loader (.38 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 ammo_type = /obj/item/ammo_casing/c38/iceblox
/obj/item/ammo_box/c9mm /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 /obj/item/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail
name = ".38 Hot Shot bullet" name = ".38 Hot Shot bullet"
damage = 20 damage = 15
stamina = 0
/obj/item/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) /obj/item/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE)
. = ..() . = ..()
if(iscarbon(target)) if(iscarbon(target))
var/mob/living/carbon/M = target var/mob/living/carbon/M = target
M.adjust_fire_stacks(6) M.adjust_fire_stacks(2)
M.IgniteMob() M.IgniteMob()
/obj/item/projectile/bullet/c38/iceblox //see /obj/item/projectile/temp for the original code /obj/item/projectile/bullet/c38/iceblox //see /obj/item/projectile/temp for the original code
name = ".38 Iceblox bullet" name = ".38 Iceblox bullet"
damage = 20 damage = 15
stamina = 0
var/temperature = 100 var/temperature = 100
/obj/item/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) /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 color = rgb(51, 19, 3) //Sickly brown
boozepwr = 300 //I warned you boozepwr = 300 //I warned you
taste_description = "a wall of bricks" taste_description = "a wall of bricks"
glass_icon_state = "glass_brown2" glass_icon_state = "bacchus"
glass_name = "Bacchus' Blessing" 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...?" 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 map kilostation
maxplayers 40 maxplayers 40
votable disabled
endmap endmap
map gaxstation map gaxstation
maxplayers 30 maxplayers 30
votable
endmap endmap
map icebox map icebox

View File

@@ -58,6 +58,72 @@
--> -->
<div class="commit sansserif"> <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> <h2 class="date">01 July 2022</h2>
<h3 class="author">Mqiib updated:</h3> <h3 class="author">Mqiib updated:</h3>
<ul class="changes bgimages16"> <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="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> <li class="rscadd">Added chem spill event</li>
</ul> </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> </div>
<b>GoonStation 13 Development Team</b> <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: Bone sword now huge, less block chance
- tweak: All claymores in ruins are now unique items in code, have updated description, - tweak: All claymores in ruins are now unique items in code, have updated description,
also damage/blockchance nerfed 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" suffix = "5x3_yogsmaintrpg.dmm"
name = "Maint yogsmaintrpg" name = "Maint yogsmaintrpg"
///Author: Vaelophis
/datum/map_template/ruin/station/maint/fivexthree/smallfish
id = "smallfish"
suffix = "5x3_smallfish.dmm"
name = "Maint smallfish"
///Author: Veeblefetzer ///Author: Veeblefetzer
/datum/map_template/ruin/station/maint/fivexthree/podmin /datum/map_template/ruin/station/maint/fivexthree/podmin
id = "podmin" id = "podmin"

View File

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

View File

@@ -20,11 +20,14 @@
paycheck_department = ACCOUNT_MED paycheck_department = ACCOUNT_MED
display_order = JOB_DISPLAY_ORDER_PSYCHIATRIST display_order = JOB_DISPLAY_ORDER_PSYCHIATRIST
changed_maps = list("OmegaStation") changed_maps = list("OmegaStation","GaxStation")
/datum/job/psych/proc/OmegaStationChanges() /datum/job/psych/proc/OmegaStationChanges()
return TRUE return TRUE
/datum/job/psych/proc/GaxStationChanges() // I'M SORRY
return TRUE
/datum/outfit/job/psych /datum/outfit/job/psych
name = "Psych" name = "Psych"
jobtype = /datum/job/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 category = "Mentor"
set name = "Mentorhelp" set name = "Mentorhelp"
mhelp(msg, FALSE)
/client/proc/mhelp(msg as text, fromadmins as num)
//clean the input msg //clean the input msg
if(!msg) return if(!msg) return
@@ -25,7 +27,7 @@
var/admininfo = "MENTORHELP:" var/admininfo = "MENTORHELP:"
if(fromadmins) if(fromadmins)
admininfo = "MENTORHELP(From Admins):" admininfo = "MENTORHELP (From Admins):"
var/show_char = CONFIG_GET(flag/mentors_mobname_only) 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>" 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]") log_mentor("[admininfo] [key_name_mentor(src, 0, 0, 0, 0)]: [msg]")

View File

@@ -48,7 +48,7 @@
if(is_mentor()) if(is_mentor())
to_chat(src, "<font color='red'>Error: Mentor-PM: Client not found.</font>", confidential=TRUE) to_chat(src, "<font color='red'>Error: Mentor-PM: Client not found.</font>", confidential=TRUE)
else 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 return
//get message text, limit it's length.and clean/escape html //get message text, limit it's length.and clean/escape html