hunger 0.1

This commit is contained in:
unid15
2015-12-08 20:22:25 +01:00
parent 82fae97d21
commit a9f3a5e5f4
18 changed files with 423 additions and 276 deletions

View File

@@ -152,3 +152,8 @@
dview_mob.loc = center; \ dview_mob.loc = center; \
dview_mob.see_invisible = invis_flags; \ dview_mob.see_invisible = invis_flags; \
for(type in view(range, dview_mob)) for(type in view(range, dview_mob))
//HARDCORE MODE STUFF (mainly hunger)
#define hardcore_mode_on ((ticker) && (ticker.hardcore_mode))
#define eligible_for_hardcore_mode(M) (M.ckey && M.client)

View File

@@ -27,6 +27,9 @@ var/global/datum/controller/gameticker/ticker
var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders
var/hardcore_mode = 0 //If set to nonzero, hardcore mode is enabled (current hardcore mode features: damage from hunger)
//Use the hardcore_mode_on macro - if(hardcore_mode_on) to_chat(user,"You're hardcore!")
var/list/syndicate_coalition = list() // list of traitor-compatible factions var/list/syndicate_coalition = list() // list of traitor-compatible factions
var/list/factions = list() // list of all factions var/list/factions = list() // list of all factions
var/list/availablefactions = list() // list of factions with openings var/list/availablefactions = list() // list of factions with openings
@@ -66,15 +69,15 @@ var/global/datum/controller/gameticker/ticker
do do
var/delay_timetotal = 3000 //actually 5 minutes or incase this is changed from 3000, (time_in_seconds * 10) var/delay_timetotal = 3000 //actually 5 minutes or incase this is changed from 3000, (time_in_seconds * 10)
pregame_timeleft = world.timeofday + delay_timetotal pregame_timeleft = world.timeofday + delay_timetotal
to_chat(world, "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>") to_chat(world, "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>")
to_chat(world, "Please, setup your character and select ready. Game will start in [(pregame_timeleft - world.timeofday) / 10] seconds") to_chat(world, "Please, setup your character and select ready. Game will start in [(pregame_timeleft - world.timeofday) / 10] seconds")
while(current_state <= GAME_STATE_PREGAME) while(current_state <= GAME_STATE_PREGAME)
for(var/i=0, i<10, i++) for(var/i=0, i<10, i++)
sleep(1) sleep(1)
vote.process() vote.process()
watchdog.check_for_update() watchdog.check_for_update()
//if(watchdog.waiting) //if(watchdog.waiting)
// to_chat(world, "<span class='notice'>Server update detected, restarting momentarily.</span>") // to_chat(world, "<span class='notice'>Server update detected, restarting momentarily.</span>")
//watchdog.signal_ready() //watchdog.signal_ready()
//return //return
if (world.timeofday < (863800 - delay_timetotal) && pregame_timeleft > 863950) // having a remaining time > the max of time of day is bad.... if (world.timeofday < (863800 - delay_timetotal) && pregame_timeleft > 863950) // having a remaining time > the max of time of day is bad....
@@ -114,7 +117,7 @@ var/global/datum/controller/gameticker/ticker
runnable_modes = config.get_runnable_modes() runnable_modes = config.get_runnable_modes()
if (runnable_modes.len==0) if (runnable_modes.len==0)
current_state = GAME_STATE_PREGAME current_state = GAME_STATE_PREGAME
to_chat(world, "<B>Unable to choose playable game mode.</B> Reverting to pre-game lobby.") to_chat(world, "<B>Unable to choose playable game mode.</B> Reverting to pre-game lobby.")
return 0 return 0
if(secret_force_mode != "secret") if(secret_force_mode != "secret")
var/datum/game_mode/M = config.pick_mode(secret_force_mode) var/datum/game_mode/M = config.pick_mode(secret_force_mode)
@@ -129,7 +132,7 @@ var/global/datum/controller/gameticker/ticker
else else
src.mode = config.pick_mode(master_mode) src.mode = config.pick_mode(master_mode)
if (!src.mode.can_start()) if (!src.mode.can_start())
to_chat(world, "<B>Unable to start [mode.name].</B> Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby.") to_chat(world, "<B>Unable to start [mode.name].</B> Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby.")
del(mode) del(mode)
current_state = GAME_STATE_PREGAME current_state = GAME_STATE_PREGAME
job_master.ResetOccupations() job_master.ResetOccupations()
@@ -140,7 +143,7 @@ var/global/datum/controller/gameticker/ticker
var/can_continue = src.mode.pre_setup()//Setup special modes var/can_continue = src.mode.pre_setup()//Setup special modes
if(!can_continue) if(!can_continue)
current_state = GAME_STATE_PREGAME current_state = GAME_STATE_PREGAME
to_chat(world, "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby.") to_chat(world, "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby.")
log_admin("The gamemode setup for [mode.name] errored out.") log_admin("The gamemode setup for [mode.name] errored out.")
world.log << "The gamemode setup for [mode.name] errored out." world.log << "The gamemode setup for [mode.name] errored out."
del(mode) del(mode)
@@ -152,8 +155,8 @@ var/global/datum/controller/gameticker/ticker
for (var/datum/game_mode/M in runnable_modes) for (var/datum/game_mode/M in runnable_modes)
modes+=M.name modes+=M.name
modes = sortList(modes) modes = sortList(modes)
to_chat(world, "<B>The current game mode is - Secret!</B>") to_chat(world, "<B>The current game mode is - Secret!</B>")
to_chat(world, "<B>Possibilities:</B> [english_list(modes)]") to_chat(world, "<B>Possibilities:</B> [english_list(modes)]")
else else
src.mode.announce() src.mode.announce()
@@ -183,9 +186,9 @@ var/global/datum/controller/gameticker/ticker
for(var/obj in L) for(var/obj in L)
if(istype(obj, /obj/effect/landmark/spacepod/random)) if(istype(obj, /obj/effect/landmark/spacepod/random))
qdel(obj) qdel(obj)
to_chat(world, "<FONT color='blue'><B>Enjoy the game!</B></FONT>") to_chat(world, "<FONT color='blue'><B>Enjoy the game!</B></FONT>")
// to_chat(world, sound('sound/AI/welcome.ogg'))// Skie //Out with the old, in with the new. - N3X15 // to_chat(world, sound('sound/AI/welcome.ogg'))// Skie //Out with the old, in with the new. - N3X15
var/welcome_sentence=list('sound/AI/vox_login.ogg') var/welcome_sentence=list('sound/AI/vox_login.ogg')
welcome_sentence += pick( welcome_sentence += pick(
'sound/AI/vox_reminder1.ogg', 'sound/AI/vox_reminder1.ogg',
@@ -274,19 +277,19 @@ var/global/datum/controller/gameticker/ticker
if("nuclear emergency") //Nuke wasn't on station when it blew up if("nuclear emergency") //Nuke wasn't on station when it blew up
flick("intro_nuke",cinematic) flick("intro_nuke",cinematic)
sleep(35) sleep(35)
world << sound('sound/effects/explosionfar.ogg') world << sound('sound/effects/explosionfar.ogg')
flick("station_intact_fade_red",cinematic) flick("station_intact_fade_red",cinematic)
cinematic.icon_state = "summary_nukefail" cinematic.icon_state = "summary_nukefail"
else else
flick("intro_nuke",cinematic) flick("intro_nuke",cinematic)
sleep(35) sleep(35)
world << sound('sound/effects/explosionfar.ogg') world << sound('sound/effects/explosionfar.ogg')
//flick("end",cinematic) //flick("end",cinematic)
if(2) //nuke was nowhere nearby //TODO: a really distant explosion animation if(2) //nuke was nowhere nearby //TODO: a really distant explosion animation
sleep(50) sleep(50)
world << sound('sound/effects/explosionfar.ogg') world << sound('sound/effects/explosionfar.ogg')
else //station was destroyed else //station was destroyed
@@ -297,19 +300,19 @@ var/global/datum/controller/gameticker/ticker
flick("intro_nuke",cinematic) flick("intro_nuke",cinematic)
sleep(35) sleep(35)
flick("station_explode_fade_red",cinematic) flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg') world << sound('sound/effects/explosionfar.ogg')
cinematic.icon_state = "summary_nukewin" cinematic.icon_state = "summary_nukewin"
if("AI malfunction") //Malf (screen,explosion,summary) if("AI malfunction") //Malf (screen,explosion,summary)
flick("intro_malf",cinematic) flick("intro_malf",cinematic)
sleep(76) sleep(76)
flick("station_explode_fade_red",cinematic) flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg') world << sound('sound/effects/explosionfar.ogg')
cinematic.icon_state = "summary_malf" cinematic.icon_state = "summary_malf"
else //Station nuked (nuke,explosion,summary) else //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic) flick("intro_nuke",cinematic)
sleep(35) sleep(35)
flick("station_explode_fade_red", cinematic) flick("station_explode_fade_red", cinematic)
world << sound('sound/effects/explosionfar.ogg') world << sound('sound/effects/explosionfar.ogg')
cinematic.icon_state = "summary_selfdes" cinematic.icon_state = "summary_selfdes"
for(var/mob/living/M in living_mob_list) for(var/mob/living/M in living_mob_list)
if(M) if(M)
@@ -357,7 +360,7 @@ var/global/datum/controller/gameticker/ticker
if(captainless) if(captainless)
for(var/mob/M in player_list) for(var/mob/M in player_list)
if(!istype(M,/mob/new_player)) if(!istype(M,/mob/new_player))
to_chat(M, "Captainship not forced on anyone.") to_chat(M, "Captainship not forced on anyone.")
for(var/mob/M in player_list) for(var/mob/M in player_list)
if(!istype(M,/mob/new_player)) if(!istype(M,/mob/new_player))
@@ -398,11 +401,11 @@ var/global/datum/controller/gameticker/ticker
if (mode.station_was_nuked) if (mode.station_was_nuked)
feedback_set_details("end_proper","nuke") feedback_set_details("end_proper","nuke")
if(!delay_end && !watchdog.waiting) if(!delay_end && !watchdog.waiting)
to_chat(world, "<span class='notice'><B>Rebooting due to destruction of station in [restart_timeout/10] seconds</B></span>") to_chat(world, "<span class='notice'><B>Rebooting due to destruction of station in [restart_timeout/10] seconds</B></span>")
else else
feedback_set_details("end_proper","\proper completion") feedback_set_details("end_proper","\proper completion")
if(!delay_end && !watchdog.waiting) if(!delay_end && !watchdog.waiting)
to_chat(world, "<span class='notice'><B>Restarting in [restart_timeout/10] seconds</B></span>") to_chat(world, "<span class='notice'><B>Restarting in [restart_timeout/10] seconds</B></span>")
if(blackbox) if(blackbox)
if(config.map_voting) if(config.map_voting)
@@ -412,13 +415,13 @@ var/global/datum/controller/gameticker/ticker
blackbox.save_all_data_to_sql() blackbox.save_all_data_to_sql()
if (watchdog.waiting) if (watchdog.waiting)
to_chat(world, "<span class='notice'><B>Server will shut down for an automatic update in [config.map_voting ? "[(restart_timeout/10)] seconds." : "a few seconds."]</B></span>") to_chat(world, "<span class='notice'><B>Server will shut down for an automatic update in [config.map_voting ? "[(restart_timeout/10)] seconds." : "a few seconds."]</B></span>")
if(config.map_voting) if(config.map_voting)
sleep(restart_timeout) //waiting for a mapvote to end sleep(restart_timeout) //waiting for a mapvote to end
if(!delay_end) if(!delay_end)
watchdog.signal_ready() watchdog.signal_ready()
else else
to_chat(world, "<span class='notice'><B>An admin has delayed the round end</B></span>") to_chat(world, "<span class='notice'><B>An admin has delayed the round end</B></span>")
delay_end = 2 delay_end = 2
else if(!delay_end) else if(!delay_end)
sleep(restart_timeout) sleep(restart_timeout)
@@ -426,10 +429,10 @@ var/global/datum/controller/gameticker/ticker
CallHook("Reboot",list()) CallHook("Reboot",list())
world.Reboot() world.Reboot()
else else
to_chat(world, "<span class='notice'><B>An admin has delayed the round end</B></span>") to_chat(world, "<span class='notice'><B>An admin has delayed the round end</B></span>")
delay_end = 2 delay_end = 2
else else
to_chat(world, "<span class='notice'><B>An admin has delayed the round end</B></span>") to_chat(world, "<span class='notice'><B>An admin has delayed the round end</B></span>")
delay_end = 2 delay_end = 2
return 1 return 1

View File

@@ -179,8 +179,14 @@ Subject's pulse: ??? BPM"})
if(M.status_flags & FAKEDEATH) if(M.status_flags & FAKEDEATH)
OX = fake_oxy > 50 ? "<font color='blue'><b>Severe oxygen deprivation detected</b></font>" : "Subject bloodstream oxygen level normal" OX = fake_oxy > 50 ? "<font color='blue'><b>Severe oxygen deprivation detected</b></font>" : "Subject bloodstream oxygen level normal"
message += ("<br>[OX] | [TX] | [BU] | [BR]") message += ("<br>[OX] | [TX] | [BU] | [BR]")
if(M.reagents.total_volume) if(M.reagents.total_volume)
message += "<br><span class='warning'>Warning: Unknown substance detected in subject's blood.</span>" message += "<br><span class='warning'>Warning: Unknown substance detected in subject's blood.</span>"
if(hardcore_mode_on && ishuman(M) && eligible_for_hardcore_mode(M))
var/mob/living/carbon/human/H = M
if(H.nutrition < STARVATION_MIN)
message += "<br><span class='danger'>Warning: Severe lack of essential nutriments detected in subject's blood.</span>"
if(iscarbon(M)) if(iscarbon(M))
var/mob/living/carbon/C = M var/mob/living/carbon/C = M
if(C.virus2.len) if(C.virus2.len)

View File

@@ -9,7 +9,7 @@ var/global/floorIsLava = 0
log_adminwarn(msg) log_adminwarn(msg)
for(var/client/C in admins) for(var/client/C in admins)
if(R_ADMIN & C.holder.rights) if(R_ADMIN & C.holder.rights)
to_chat(C, msg) to_chat(C, msg)
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages /proc/msg_admin_attack(var/text) //Toggleable Attack Messages
var/rendered = "<span class=\"admin\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[text]</span></span>" var/rendered = "<span class=\"admin\"><span class=\"prefix\">ADMIN LOG:</span> <span class=\"message\">[text]</span></span>"
@@ -18,7 +18,7 @@ var/global/floorIsLava = 0
if(R_ADMIN & C.holder.rights) if(R_ADMIN & C.holder.rights)
if(C.prefs.toggles & CHAT_ATTACKLOGS) if(C.prefs.toggles & CHAT_ATTACKLOGS)
var/msg = rendered var/msg = rendered
to_chat(C, msg) to_chat(C, msg)
// Not happening. // Not happening.
// Yes I could do a +PERMISSIONS check but I'm both too lazy and worried admins might do it on accident. // Yes I could do a +PERMISSIONS check but I'm both too lazy and worried admins might do it on accident.
@@ -33,12 +33,12 @@ var/global/floorIsLava = 0
set desc="Edit player (respawn, ban, heal, etc)" set desc="Edit player (respawn, ban, heal, etc)"
if(!M) if(!M)
to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.") to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.")
return return
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
src = usr.client.holder src = usr.client.holder
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!") to_chat(usr, "Error: you are not an admin!")
return return
checkSessionKey() checkSessionKey()
@@ -245,7 +245,7 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
src = usr.client.holder src = usr.client.holder
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!") to_chat(usr, "Error: you are not an admin!")
return return
PlayerNotesPage(1) PlayerNotesPage(1)
@@ -258,13 +258,13 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
src = usr.client.holder src = usr.client.holder
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!") to_chat(usr, "Error: you are not an admin!")
return return
checkSessionKey() checkSessionKey()
var/cid = input("Type computer ID", "CID", 0) as num | null var/cid = input("Type computer ID", "CID", 0) as num | null
if(cid) if(cid)
usr << link(getVGPanel("rapsheet", admin = 1, query = list("cid" = cid))) usr << link(getVGPanel("rapsheet", admin = 1, query = list("cid" = cid)))
// to_chat(usr, link("[config.vgws_base_url]/index.php/rapsheet/?s=[sessKey]&cid=[cid]")) // to_chat(usr, link("[config.vgws_base_url]/index.php/rapsheet/?s=[sessKey]&cid=[cid]"))
return return
/datum/admins/proc/checkCKEY() /datum/admins/proc/checkCKEY()
@@ -276,12 +276,12 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
src = usr.client.holder src = usr.client.holder
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!") to_chat(usr, "Error: you are not an admin!")
return return
checkSessionKey() checkSessionKey()
var/ckey = lowertext(input("Type player ckey", "ckey", null) as text | null) var/ckey = lowertext(input("Type player ckey", "ckey", null) as text | null)
usr << link(getVGPanel("rapsheet", admin = 1, query = list("ckey" = ckey))) usr << link(getVGPanel("rapsheet", admin = 1, query = list("ckey" = ckey)))
// usr << link("[config.vgws_base_url]/index.php/rapsheet/?s=[sessKey]&ckey=[ckey]") // usr << link("[config.vgws_base_url]/index.php/rapsheet/?s=[sessKey]&ckey=[ckey]")
return return
/datum/admins/proc/PlayerNotesPage(page) /datum/admins/proc/PlayerNotesPage(page)
@@ -362,7 +362,7 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
src = usr.client.holder src = usr.client.holder
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!") to_chat(usr, "Error: you are not an admin!")
return return
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
@@ -390,7 +390,7 @@ var/global/floorIsLava = 0
if(I.author == usr.key || check_rights(R_PERMISSIONS, show_msg = 0)) if(I.author == usr.key || check_rights(R_PERMISSIONS, show_msg = 0))
dat += "<A href='?src=\ref[src];remove_player_info=[key];remove_index=[i]'>Remove</A>" dat += "<A href='?src=\ref[src];remove_player_info=[key];remove_index=[i]'>Remove</A>"
dat += "<br><br>" dat += "<br><br>"
if(update_file) to_chat(info, infos) if(update_file) to_chat(info, infos)
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
@@ -411,7 +411,7 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
src = usr.client.holder src = usr.client.holder
if (!istype(src,/datum/admins)) if (!istype(src,/datum/admins))
to_chat(usr, "Error: you are not an admin!") to_chat(usr, "Error: you are not an admin!")
return return
var/dat var/dat
dat = text("<HEAD><TITLE>Admin Newscaster</TITLE></HEAD><H3>Admin Newscaster Unit</H3>") dat = text("<HEAD><TITLE>Admin Newscaster</TITLE></HEAD><H3>Admin Newscaster Unit</H3>")
@@ -642,8 +642,8 @@ var/global/floorIsLava = 0
else else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
// to_chat(world, "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]") // to_chat(world, "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]")
// to_chat(world, "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]") // to_chat(world, "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]")
usr << browse(dat, "window=admincaster_main;size=400x600") usr << browse(dat, "window=admincaster_main;size=400x600")
onclose(usr, "admincaster_main") onclose(usr, "admincaster_main")
@@ -757,6 +757,7 @@ var/global/floorIsLava = 0
<BR> <BR>
<B>Fun Secrets</B><BR> <B>Fun Secrets</B><BR>
<BR> <BR>
<A href='?src=\ref[src];secretsfun=hardcore_mode'>[ticker&&ticker.hardcore_mode ? "Disable" : "Enable"] hardcore mode (makes starvation kill!)</A><BR>
<A href='?src=\ref[src];secretsfun=sec_clothes'>Remove 'internal' clothing</A><BR> <A href='?src=\ref[src];secretsfun=sec_clothes'>Remove 'internal' clothing</A><BR>
<A href='?src=\ref[src];secretsfun=sec_all_clothes'>Remove ALL clothing</A><BR> <A href='?src=\ref[src];secretsfun=sec_all_clothes'>Remove ALL clothing</A><BR>
<A href='?src=\ref[src];secretsfun=monkey'>Turn all humans into monkeys</A><BR> <A href='?src=\ref[src];secretsfun=monkey'>Turn all humans into monkeys</A><BR>
@@ -883,7 +884,7 @@ var/global/floorIsLava = 0
if(confirm == "Cancel") if(confirm == "Cancel")
return return
if(confirm == "Yes") if(confirm == "Yes")
to_chat(world, "<span class='warning'><b>Restarting world!</b> <span class='notice'>Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!</span>") to_chat(world, "<span class='warning'><b>Restarting world!</b> <span class='notice'>Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!</span>")
log_admin("[key_name(usr)] initiated a reboot.") log_admin("[key_name(usr)] initiated a reboot.")
feedback_set_details("end_error","admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") feedback_set_details("end_error","admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]")
@@ -895,7 +896,7 @@ var/global/floorIsLava = 0
CallHook("Reboot",list()) CallHook("Reboot",list())
if (watchdog.waiting) if (watchdog.waiting)
to_chat(world, "<span class='notice'><B>Server will shut down for an automatic update in a few seconds.</B></span>") to_chat(world, "<span class='notice'><B>Server will shut down for an automatic update in a few seconds.</B></span>")
watchdog.signal_ready() watchdog.signal_ready()
return return
@@ -914,7 +915,7 @@ var/global/floorIsLava = 0
if(message) if(message)
if(!check_rights(R_SERVER,0)) if(!check_rights(R_SERVER,0))
message = adminscrub(message,500) message = adminscrub(message,500)
to_chat(world, "<span class='notice'><b>[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:</b>\n \t [message]</span>") to_chat(world, "<span class='notice'><b>[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:</b>\n \t [message]</span>")
log_admin("Announce: [key_name(usr)] : [message]") log_admin("Announce: [key_name(usr)] : [message]")
feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -925,9 +926,9 @@ var/global/floorIsLava = 0
ooc_allowed = !( ooc_allowed ) ooc_allowed = !( ooc_allowed )
if (ooc_allowed) if (ooc_allowed)
to_chat(world, "<B>The OOC channel has been globally enabled!</B>") to_chat(world, "<B>The OOC channel has been globally enabled!</B>")
else else
to_chat(world, "<B>The OOC channel has been globally disabled!</B>") to_chat(world, "<B>The OOC channel has been globally disabled!</B>")
log_admin("[key_name(usr)] toggled OOC.") log_admin("[key_name(usr)] toggled OOC.")
message_admins("[key_name_admin(usr)] toggled OOC.", 1) message_admins("[key_name_admin(usr)] toggled OOC.", 1)
feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -968,7 +969,7 @@ var/global/floorIsLava = 0
feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return 1 return 1
else else
to_chat(usr, "<font color='red'>Error: Start Now: Game has already started.</font>") to_chat(usr, "<font color='red'>Error: Start Now: Game has already started.</font>")
return 0 return 0
/datum/admins/proc/toggleenter() /datum/admins/proc/toggleenter()
@@ -978,9 +979,9 @@ var/global/floorIsLava = 0
enter_allowed = !( enter_allowed ) enter_allowed = !( enter_allowed )
if (!( enter_allowed )) if (!( enter_allowed ))
to_chat(world, "<B>New players may no longer enter the game.</B>") to_chat(world, "<B>New players may no longer enter the game.</B>")
else else
to_chat(world, "<B>New players may now enter the game.</B>") to_chat(world, "<B>New players may now enter the game.</B>")
log_admin("[key_name(usr)] toggled new player game entering.") log_admin("[key_name(usr)] toggled new player game entering.")
message_admins("<span class='notice'>[key_name_admin(usr)] toggled new player game entering.</span>", 1) message_admins("<span class='notice'>[key_name_admin(usr)] toggled new player game entering.</span>", 1)
world.update_status() world.update_status()
@@ -993,9 +994,9 @@ var/global/floorIsLava = 0
config.allow_ai = !( config.allow_ai ) config.allow_ai = !( config.allow_ai )
if (!( config.allow_ai )) if (!( config.allow_ai ))
to_chat(world, "<B>The AI job is no longer chooseable.</B>") to_chat(world, "<B>The AI job is no longer chooseable.</B>")
else else
to_chat(world, "<B>The AI job is chooseable now.</B>") to_chat(world, "<B>The AI job is chooseable now.</B>")
log_admin("[key_name(usr)] toggled AI allowed.") log_admin("[key_name(usr)] toggled AI allowed.")
world.update_status() world.update_status()
feedback_add_details("admin_verb","TAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","TAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -1007,9 +1008,9 @@ var/global/floorIsLava = 0
abandon_allowed = !( abandon_allowed ) abandon_allowed = !( abandon_allowed )
if (abandon_allowed) if (abandon_allowed)
to_chat(world, "<B>You may now respawn.</B>") to_chat(world, "<B>You may now respawn.</B>")
else else
to_chat(world, "<B>You may no longer respawn :(</B>") to_chat(world, "<B>You may no longer respawn :(</B>")
message_admins("<span class='notice'>[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].</span>", 1) message_admins("<span class='notice'>[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].</span>", 1)
log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].") log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].")
world.update_status() world.update_status()
@@ -1035,7 +1036,7 @@ var/global/floorIsLava = 0
if(!check_rights(R_ADMIN)) return if(!check_rights(R_ADMIN)) return
if (!ticker || ticker.current_state != GAME_STATE_PREGAME) if (!ticker || ticker.current_state != GAME_STATE_PREGAME)
if(ticker.delay_end == 2) if(ticker.delay_end == 2)
to_chat(world, "<font size=4><span class='danger'>World Reboot triggered by [key_name(usr)]!</font></span>") to_chat(world, "<font size=4><span class='danger'>World Reboot triggered by [key_name(usr)]!</font></span>")
log_admin("<font size=4><span class='danger'>World Reboot triggered by [key_name(usr)]!</font></span>") log_admin("<font size=4><span class='danger'>World Reboot triggered by [key_name(usr)]!</font></span>")
if(watchdog.waiting) if(watchdog.waiting)
watchdog.signal_ready() watchdog.signal_ready()
@@ -1049,11 +1050,11 @@ var/global/floorIsLava = 0
if (!( going )) if (!( going ))
going = LOBBY_TICKING_RESTARTED going = LOBBY_TICKING_RESTARTED
ticker.pregame_timeleft = world.timeofday + ticker.remaining_time ticker.pregame_timeleft = world.timeofday + ticker.remaining_time
to_chat(world, "<b>The game will start soon.</b>") to_chat(world, "<b>The game will start soon.</b>")
log_admin("[key_name(usr)] removed the delay.") log_admin("[key_name(usr)] removed the delay.")
else else
going = LOBBY_TICKING_STOPPED going = LOBBY_TICKING_STOPPED
to_chat(world, "<b>The game start has been delayed.</b>") to_chat(world, "<b>The game start has been delayed.</b>")
log_admin("[key_name(usr)] delayed the game.") log_admin("[key_name(usr)] delayed the game.")
feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
#undef LOBBY_TICKING_STOPPED #undef LOBBY_TICKING_STOPPED
@@ -1093,7 +1094,7 @@ var/global/floorIsLava = 0
if(!usr.client.holder) return if(!usr.client.holder) return
if( alert("Reboot server?",,"Yes","No") == "No") if( alert("Reboot server?",,"Yes","No") == "No")
return return
to_chat(world, "<span class='warning'><b>Rebooting world!</b> <span class='notice'>Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!</span>") to_chat(world, "<span class='warning'><b>Rebooting world!</b> <span class='notice'>Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!</span>")
log_admin("[key_name(usr)] initiated an immediate reboot.") log_admin("[key_name(usr)] initiated an immediate reboot.")
feedback_set_details("end_error","immediate admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") feedback_set_details("end_error","immediate admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]")
@@ -1105,7 +1106,7 @@ var/global/floorIsLava = 0
CallHook("Reboot",list()) CallHook("Reboot",list())
if (watchdog.waiting) if (watchdog.waiting)
to_chat(world, "<span class='notice'><B>Server will shut down for an automatic update in a few seconds.</B></span>") to_chat(world, "<span class='notice'><B>Server will shut down for an automatic update in a few seconds.</B></span>")
watchdog.signal_ready() watchdog.signal_ready()
return return
@@ -1231,10 +1232,10 @@ var/global/floorIsLava = 0
set name = "Show Traitor Panel" set name = "Show Traitor Panel"
if(!istype(M)) if(!istype(M))
to_chat(usr, "This can only be used on instances of type /mob") to_chat(usr, "This can only be used on instances of type /mob")
return return
if(!M.mind) if(!M.mind)
to_chat(usr, "This mob has no mind!") to_chat(usr, "This mob has no mind!")
return return
M.mind.edit_memory() M.mind.edit_memory()
@@ -1248,9 +1249,9 @@ var/global/floorIsLava = 0
tinted_weldhelh = !( tinted_weldhelh ) tinted_weldhelh = !( tinted_weldhelh )
if (tinted_weldhelh) if (tinted_weldhelh)
to_chat(world, "<B>The tinted_weldhelh has been enabled!</B>") to_chat(world, "<B>The tinted_weldhelh has been enabled!</B>")
else else
to_chat(world, "<B>The tinted_weldhelh has been disabled!</B>") to_chat(world, "<B>The tinted_weldhelh has been disabled!</B>")
log_admin("[key_name(usr)] toggled tinted_weldhelh.") log_admin("[key_name(usr)] toggled tinted_weldhelh.")
message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.", 1) message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.", 1)
feedback_add_details("admin_verb","TTWH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","TTWH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -1262,9 +1263,9 @@ var/global/floorIsLava = 0
guests_allowed = !( guests_allowed ) guests_allowed = !( guests_allowed )
if (!( guests_allowed )) if (!( guests_allowed ))
to_chat(world, "<B>Guests may no longer enter the game.</B>") to_chat(world, "<B>Guests may no longer enter the game.</B>")
else else
to_chat(world, "<B>Guests may now enter the game.</B>") to_chat(world, "<B>Guests may now enter the game.</B>")
log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.") log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.")
message_admins("<span class='notice'>[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.</span>", 1) message_admins("<span class='notice'>[key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.</span>", 1)
feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -1282,27 +1283,27 @@ var/global/floorIsLava = 0
for(var/mob/living/silicon/S in mob_list) for(var/mob/living/silicon/S in mob_list)
ai_number++ ai_number++
if(isAI(S)) if(isAI(S))
to_chat(usr, "<b>AI [key_name(S, usr)]'s laws:</b>") to_chat(usr, "<b>AI [key_name(S, usr)]'s laws:</b>")
else if(isrobot(S)) else if(isrobot(S))
var/mob/living/silicon/robot/R = S var/mob/living/silicon/robot/R = S
to_chat(usr, "<b>CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independant)"]: laws:</b>") to_chat(usr, "<b>CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independant)"]: laws:</b>")
else if (ispAI(S)) else if (ispAI(S))
var/mob/living/silicon/pai/pAI = S var/mob/living/silicon/pai/pAI = S
to_chat(usr, "<b>pAI [key_name(S, usr)]'s laws (master: [pAI.master] ):</b>") to_chat(usr, "<b>pAI [key_name(S, usr)]'s laws (master: [pAI.master] ):</b>")
else else
to_chat(usr, "<b>SOMETHING SILICON [key_name(S, usr)]'s laws:</b>") to_chat(usr, "<b>SOMETHING SILICON [key_name(S, usr)]'s laws:</b>")
if(ispAI(S)) if(ispAI(S))
var/mob/living/silicon/pai/pAI = S var/mob/living/silicon/pai/pAI = S
pAI.show_directives(usr) pAI.show_directives(usr)
else if (S.laws == null) else if (S.laws == null)
to_chat(usr, "[key_name(S, usr)]'s laws are null?? Contact a coder.") to_chat(usr, "[key_name(S, usr)]'s laws are null?? Contact a coder.")
else else
S.laws.show_laws(usr) S.laws.show_laws(usr)
if(!ai_number) if(!ai_number)
to_chat(usr, "<b>No AIs located</b>")//Just so you know the thing is actually working and not just ignoring you. to_chat(usr, "<b>No AIs located</b>")//Just so you know the thing is actually working and not just ignoring you.
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob in mob_list) /client/proc/update_mob_sprite(mob/living/carbon/human/H as mob in mob_list)
set category = "Admin" set category = "Admin"
@@ -1310,7 +1311,7 @@ var/global/floorIsLava = 0
set desc = "Should fix any mob sprite update errors." set desc = "Should fix any mob sprite update errors."
if (!holder) if (!holder)
to_chat(src, "Only administrators may use this command.") to_chat(src, "Only administrators may use this command.")
return return
if(istype(H)) if(istype(H))

File diff suppressed because it is too large Load Diff

View File

@@ -218,14 +218,17 @@
if(!user) return if(!user) return
if(distance <= 1 && user.stat != 1) if(distance <= 1 && user.stat != 1)
if(pulse == PULSE_NONE || (status_flags & FAKEDEATH)) if(pulse == PULSE_NONE || (status_flags & FAKEDEATH))
to_chat(user, "<span class='deadsay'>[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]...</span>") to_chat(user, "<span class='deadsay'>[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]...</span>")
else else
to_chat(user, "<span class='deadsay'>[t_He] has a pulse!</span>") to_chat(user, "<span class='deadsay'>[t_He] has a pulse!</span>")
msg += "<span class='warning'>" msg += "<span class='warning'>"
if(nutrition < 100) if(nutrition < 100)
msg += "[t_He] [t_is] severely malnourished.\n" if(hardcore_mode_on && eligible_for_hardcore_mode(src))
msg += "<span class='danger'>[t_He] [t_is] severely malnourished.</span>\n"
else
msg += "[t_He] [t_is] severely malnourished.\n"
else if(nutrition >= 500) else if(nutrition >= 500)
if(user.nutrition < 100) if(user.nutrition < 100)
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n" msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
@@ -477,7 +480,7 @@
pose = addtext(pose,".") //Makes sure all emotes end with a period. pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\n[t_He] is [pose]" msg += "\n[t_He] is [pose]"
to_chat(user, msg) to_chat(user, msg)
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
/proc/hasHUD(mob/M as mob, hudtype) /proc/hasHUD(mob/M as mob, hudtype)

View File

@@ -132,6 +132,15 @@
if(!delay_ready_dna) if(!delay_ready_dna)
dna.ready_dna(src) dna.ready_dna(src)
if(hardcore_mode_on)
spawn(2 SECONDS)
//Hardcore mode stuff
//Warn the player that not eating will lead to his death
if(eligible_for_hardcore_mode(src))
to_chat(src, "<h5><span class='notice'>Hardcode mode is enabled!</span></h5>")
to_chat(src, "<b>You must eat to survive. Starvation for extended periods of time will kill you!</b>")
to_chat(src, "<b>Keep an eye out on the hunger indicator on the right of your screen; it will start flashing red and black when you're close to starvation.</b>")
/mob/living/carbon/human/player_panel_controls() /mob/living/carbon/human/player_panel_controls()
var/html="" var/html=""

View File

@@ -78,7 +78,13 @@
//Nutrition decrease //Nutrition decrease
if(nutrition > 0 && stat != 2) if(nutrition > 0 && stat != 2)
nutrition = max (0, nutrition - HUNGER_FACTOR) //Nutrition decreases slower when you're sleeping
var/reduce_nutrition_by = HUNGER_FACTOR
if(sleeping)
reduce_nutrition_by *= 0.25 //Reduce hunger factor by 75%
nutrition = max (0, nutrition - reduce_nutrition_by)
if(nutrition > 450) if(nutrition > 450)
if(overeatduration < 600) //capped so people don't take forever to unfat if(overeatduration < 600) //capped so people don't take forever to unfat

View File

@@ -195,6 +195,10 @@
if(150 to 250) nutrition_icon.icon_state = "nutrition3" if(150 to 250) nutrition_icon.icon_state = "nutrition3"
else nutrition_icon.icon_state = "nutrition4" else nutrition_icon.icon_state = "nutrition4"
if(ticker && ticker.hardcore_mode) //Hardcore mode: flashing nutrition indicator when starving!
if(nutrition < STARVATION_MIN)
nutrition_icon.icon_state = "nutrition5"
if(pressure) if(pressure)
pressure.icon_state = "pressure[pressure_alert]" pressure.icon_state = "pressure[pressure_alert]"

View File

@@ -17,3 +17,71 @@
if(!(M.status_flags & GODMODE)) if(!(M.status_flags & GODMODE))
M.adjustBruteLoss(5) M.adjustBruteLoss(5)
nutrition += 10 nutrition += 10
//I put the nutriment stuff here
if(!hardcore_mode_on) return //If hardcore mode isn't on, return
if(!eligible_for_hardcore_mode(src)) return //If our mob isn't affected by hardcore mode (like it isn't player controlled), return
if(src.isDead()) return //Don't affect dead dudes
if(nutrition < 100) //Nutrition is below 100 = starvation
var/list/hunger_phrases = list(
"You feel weak and malnourished. You must find something to eat now!",
"You haven't eaten in ages, and your body feels weak! It's time to eat something.",
"You can barely remember the last time you had a proper, nutritional meal. Your body will shut down soon if you don't eat something!",
"Your body is running out of essential nutrients! You have to eat something soon.",
"If you don't eat something very soon, you're going to starve to death."
)
//When you're starving, the rate at which oxygen damage is healed is reduced by 80% (you only restore 1 oxygen damage per life tick, instead of 5)
switch(nutrition)
if(STARVATION_NOTICE to STARVATION_MIN) //60-80
if(sleeping) return
if(prob(2))
to_chat(src, "<span class='notice'>[pick("You're very hungry.","You really could use a meal right now.")]</span>")
if(STARVATION_WEAKNESS to STARVATION_NOTICE) //30-60
if(sleeping) return
if(prob(3)) //3% chance of a tiny amount of oxygen damage (1-10)
adjustOxyLoss(rand(1,10))
to_chat(src, "<span class='danger'>[pick(hunger_phrases)]</span>")
else if(prob(5)) //5% chance of being weakened
eye_blurry += 10
Weaken(10)
adjustOxyLoss(rand(1,15))
to_chat(src, "<span class='danger'>You're starving! The lack of strength makes you black out for a few moments...</span>")
if(STARVATION_NEARDEATH to STARVATION_WEAKNESS) //5-30, 5% chance of weakening and 1-230 oxygen damage. 5% chance of a seizure. 10% chance of dropping item
if(sleeping) return
if(prob(5))
adjustOxyLoss(rand(1,20))
to_chat(src, "<span class='danger'>You're starving. You feel your life force slowly leaving your body...</span>")
eye_blurry += 20
if(weakened < 1) Weaken(20)
else if(paralysis<1 && prob(5)) //Mini seizure (25% duration and strength of a normal seizure)
visible_message("<span class='danger'>\The [src] starts having a seizure!</span>", \
"<span class='warning'>You have a seizure!</span>")
Paralyse(2.5)
Jitter(250)
adjustOxyLoss(rand(1,25))
eye_blurry += 20
if(-INFINITY to STARVATION_NEARDEATH) //Fuck the whole body up at this point
to_chat(src, "<span class='danger'>You are dying from starvation!</span>")
adjustToxLoss(STARVATION_TOX_DAMAGE)
adjustOxyLoss(STARVATION_OXY_DAMAGE)
adjustBrainLoss(STARVATION_BRAIN_DAMAGE)
if(prob(10))
Weaken(15)

View File

@@ -225,7 +225,14 @@ var/global/list/whitelisted_species = list("Human")
else // We're in safe limits else // We're in safe limits
H.failed_last_breath = 0 H.failed_last_breath = 0
H.adjustOxyLoss(-5)
var/oxy_restored = 5
if(hardcore_mode_on && eligible_for_hardcore_mode(H)) //HARDCORE MODE stuff
if(H.nutrition < STARVATION_MIN) //Starvation makes oxygen damage heal at a slower rate!
oxy_restored = STARVATION_OXY_HEAL_RATE //Defined as 1
H.adjustOxyLoss(-oxy_restored)
oxygen_used = breath.oxygen/6 oxygen_used = breath.oxygen/6
H.oxygen_alert = 0 H.oxygen_alert = 0

View File

@@ -1343,3 +1343,21 @@ var/proccalls = 1
#define MODE_CHANGELING "changeling" #define MODE_CHANGELING "changeling"
#define MODE_CULTCHAT "cultchat" #define MODE_CULTCHAT "cultchat"
#define MODE_ANCIENT "ancientchat" #define MODE_ANCIENT "ancientchat"
//Hardcore mode stuff
#define STARVATION_MIN 60 //If you have less nutrition than this value, the hunger indicator starts flashing
#define STARVATION_NOTICE 45 //If you have more nutrition than this value, you get an occasional message reminding you that you're going to starve soon
#define STARVATION_WEAKNESS 20 //Otherwise, if you have more nutrition than this value, you occasionally become weak and receive minor damage
#define STARVATION_NEARDEATH 5 //Otherwise, if you have more nutrition than this value, you have seizures and occasionally receive damage
//If you have less nutrition than STARVATION_NEARDEATH, you start getting damage
#define STARVATION_OXY_DAMAGE 2.5
#define STARVATION_TOX_DAMAGE 2.5
#define STARVATION_BRAIN_DAMAGE 2.5
#define STARVATION_OXY_HEAL_RATE 1 //While starving, THIS much oxygen damage is restored per life tick (instead of the default 5)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 28 KiB