From 6bfca33a78662b2db9017e60f76535463d388379 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 11 Dec 2017 17:57:20 +0100 Subject: [PATCH 01/97] Roundend report refactor --- code/__DEFINES/clockcult.dm | 1 - code/__HELPERS/roundend.dm | 412 ++++++++++++++++++ code/_globalvars/game_modes.dm | 18 +- code/_globalvars/misc.dm | 2 + code/_onclick/hud/alert.dm | 31 +- code/controllers/subsystem/blackbox.dm | 8 +- code/controllers/subsystem/ticker.dm | 3 + code/controllers/subsystem/vote.dm | 11 + code/datums/ai_laws.dm | 29 +- code/datums/antagonists/abductor.dm | 63 +++ code/datums/antagonists/antag_datum.dm | 58 ++- code/datums/antagonists/brother.dm | 68 +++ code/datums/antagonists/changeling.dm | 33 +- code/datums/antagonists/clockcult.dm | 53 ++- code/datums/antagonists/cult.dm | 259 ++++++++--- code/datums/antagonists/datum_traitor.dm | 60 ++- code/datums/antagonists/devil.dm | 30 ++ code/datums/antagonists/ninja.dm | 21 +- code/datums/antagonists/nukeop.dm | 322 ++++++++++++++ code/datums/antagonists/pirate.dm | 57 ++- code/datums/antagonists/revolution.dm | 55 ++- code/datums/antagonists/wizard.dm | 48 +- code/datums/mind.dm | 62 ++- code/game/gamemodes/antag_spawner.dm | 1 + code/game/gamemodes/brother/traitor_bro.dm | 43 +- code/game/gamemodes/changeling/changeling.dm | 3 + code/game/gamemodes/clock_cult/clock_cult.dm | 46 +- .../clock_items/construct_chassis.dm | 3 +- .../clock_cult/clock_mobs/_eminence.dm | 22 +- .../clock_structures/eminence_spire.dm | 10 +- code/game/gamemodes/cult/cult.dm | 210 ++------- code/game/gamemodes/cult/cult_comms.dm | 68 +-- code/game/gamemodes/cult/ritual.dm | 23 +- code/game/gamemodes/cult/runes.dm | 25 +- code/game/gamemodes/devil/game_mode.dm | 38 -- code/game/gamemodes/game_mode.dm | 97 +---- code/game/gamemodes/meteor/meteor.dm | 19 +- .../miniantags/abduction/abduction.dm | 43 -- .../abduction/machinery/experiment.dm | 20 +- .../gamemodes/miniantags/monkey/monkey.dm | 11 +- code/game/gamemodes/miniantags/morph/morph.dm | 1 + .../gamemodes/miniantags/revenant/revenant.dm | 1 + .../miniantags/slaughter/slaughterevent.dm | 1 + code/game/gamemodes/nuclear/nuclear.dm | 40 ++ code/game/gamemodes/objective_team.dm | 14 +- code/game/gamemodes/revolution/revolution.dm | 58 +-- code/game/gamemodes/traitor/traitor.dm | 7 +- code/game/gamemodes/wizard/soulstone.dm | 3 +- code/game/gamemodes/wizard/wizard.dm | 20 +- code/game/machinery/wishgranter.dm | 1 + code/modules/admin/admin.dm | 8 +- code/modules/admin/verbs/one_click_antag.dm | 9 + code/modules/admin/verbs/onlyone.dm | 3 + .../awaymissions/mission_code/wildwest.dm | 2 + code/modules/client/client_defines.dm | 6 + code/modules/client/client_procs.dm | 7 + code/modules/client/player_details.dm | 2 + code/modules/clothing/under/accessories.dm | 2 +- code/modules/events/holiday/vday.dm | 7 + code/modules/events/nightmare.dm | 1 + .../modules/events/wizard/departmentrevolt.dm | 1 + code/modules/events/wizard/greentext.dm | 1 + code/modules/mob/living/silicon/robot/life.dm | 1 + .../mob/living/simple_animal/constructs.dm | 10 +- .../friendly/drone/extra_drone_types.dm | 2 +- code/modules/mob/login.dm | 4 + code/modules/ninja/ninja_event.dm | 2 +- code/modules/power/singularity/narsie.dm | 11 +- .../spells/spell_types/rightandwrong.dm | 2 + code/modules/station_goals/station_goal.dm | 6 +- html/browser/roundend.css | 67 +++ tgstation.dme | 2 + 72 files changed, 1928 insertions(+), 760 deletions(-) create mode 100644 code/__HELPERS/roundend.dm create mode 100644 code/datums/antagonists/nukeop.dm create mode 100644 code/modules/client/player_details.dm create mode 100644 html/browser/roundend.css diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index d51dbfd047..7451c42cab 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -6,7 +6,6 @@ #define HIEROPHANT_ANSIBLE "hierophant_ansible" //Use this for construction-related scripture! GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult -GLOBAL_VAR_INIT(clockwork_caches, 0) //How many clockwork caches exist in the world (not each individual) GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total GLOBAL_VAR_INIT(clockwork_power, 0) //How many watts of power are globally available to the clockwork cult diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm new file mode 100644 index 0000000000..7bd08167e6 --- /dev/null +++ b/code/__HELPERS/roundend.dm @@ -0,0 +1,412 @@ +/datum/controller/subsystem/ticker/proc/gather_roundend_feedback() + var/clients = GLOB.player_list.len + var/surviving_humans = 0 + var/surviving_total = 0 + var/ghosts = 0 + var/escaped_humans = 0 + var/escaped_total = 0 + + for(var/mob/M in GLOB.player_list) + if(ishuman(M)) + if(!M.stat) + surviving_humans++ + if(M.z == ZLEVEL_CENTCOM) + escaped_humans++ + if(!M.stat) + surviving_total++ + if(M.z == ZLEVEL_CENTCOM) + escaped_total++ + + if(isobserver(M)) + ghosts++ + + if(clients) + SSblackbox.record_feedback("nested tally", "round_end_stats", clients, list("clients")) + if(ghosts) + SSblackbox.record_feedback("nested tally", "round_end_stats", ghosts, list("ghosts")) + if(surviving_humans) + SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_humans, list("survivors", "human")) + if(surviving_total) + SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_total, list("survivors", "total")) + if(escaped_humans) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_humans, list("escapees", "human")) + if(escaped_total) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_total, list("escapees", "total")) + + gather_antag_success_rate() + +/datum/controller/subsystem/ticker/proc/gather_antag_success_rate() + var/team_gid = 1 + var/list/team_ids = list() + + for(var/datum/antagonist/A in GLOB.antagonists) + var/list/antag_info = list() + antag_info["key"] = A.owner.key + antag_info["name"] = A.owner.name + antag_info["antagonist_type"] = A.type + antag_info["antagonist_name"] = A.name //For auto and custom roles + antag_info["objectives"] = list() + antag_info["team"] = list() + var/datum/objective_team/T = A.get_team() + if(T) + antag_info["team"]["type"] = T.type + antag_info["team"]["name"] = T.name + if(!team_ids[T]) + team_ids[T] = team_gid++ + antag_info["team"]["id"] = team_ids[T] + + if(!A.owner) + continue + if(A.objectives.len) + for(var/datum/objective/O in A.objectives) + var/result = O.check_completion() ? "SUCCESS" : "FAIL" + antag_info["objectives"] += list(list("objective_type"=O.type,"text"=O.explanation_text,"result"=result)) + SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) + + +/datum/controller/subsystem/ticker/proc/declare_completion() + set waitfor = FALSE + + to_chat(world, "


The round has ended.") + if(LAZYLEN(GLOB.round_end_notifiees)) + send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") + + for(var/client/C in GLOB.clients) + if(!C.credits) + C.RollCredits() + C.playtitlemusic(40) + + display_report() + + gather_roundend_feedback() + + CHECK_TICK + + //Set news report and mode result + mode.set_round_result() + + send2irc("Server", "Round just ended.") + + if(CONFIG_GET(string/cross_server_address)) + send_news_report() + + CHECK_TICK + + //These need update to actually reflect the real antagonists + //Print a list of antagonists to the server log + var/list/total_antagonists = list() + //Look into all mobs in world, dead or alive + for(var/datum/mind/Mind in minds) + var/temprole = Mind.special_role + if(temprole) //if they are an antagonist of some sort. + if(temprole in total_antagonists) //If the role exists already, add the name to it + total_antagonists[temprole] += ", [Mind.name]([Mind.key])" + else + total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob + total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + + CHECK_TICK + + //Now print them all into the log! + log_game("Antagonists at round end were...") + for(var/i in total_antagonists) + log_game("[i]s[total_antagonists[i]].") + + CHECK_TICK + + //Collects persistence features + if(mode.allow_persistence_save) + SSpersistence.CollectData() + + //stop collecting feedback during grifftime + SSblackbox.Seal() + + sleep(50) + ready_for_reboot = TRUE + standard_reboot() + +/datum/controller/subsystem/ticker/proc/standard_reboot() + if(ready_for_reboot) + if(mode.station_was_nuked) + Reboot("Station destroyed by Nuclear Device.", "nuke") + else + Reboot("Round ended.", "proper completion") + else + CRASH("Attempted standard reboot without ticker roundend completion") + +//Common part of the report +/datum/controller/subsystem/ticker/proc/build_roundend_report() + var/list/parts = list() + + //Gamemode specific things. Should be empty most of the time. + parts += mode.special_report() + + CHECK_TICK + + //AI laws + parts += law_report() + + CHECK_TICK + + //Antagonists + parts += antag_report() + + CHECK_TICK + //Medals + parts += medal_report() + //Station Goals + parts += goal_report() + + listclearnulls(parts) + + return parts.Join() + + +/datum/controller/subsystem/ticker/proc/survivor_report() + var/list/parts = list() + var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED + var/num_survivors = 0 + var/num_escapees = 0 + var/num_shuttle_escapees = 0 + + //Player status report + for(var/i in GLOB.mob_list) + var/mob/Player = i + if(Player.mind && !isnewplayer(Player)) + if(Player.stat != DEAD && !isbrain(Player)) + num_survivors++ + if(station_evacuated) //If the shuttle has already left the station + var/list/area/shuttle_areas + if(SSshuttle && SSshuttle.emergency) + shuttle_areas = SSshuttle.emergency.shuttle_areas + if(Player.onCentCom() || Player.onSyndieBase()) + num_escapees++ + if(shuttle_areas[get_area(Player)]) + num_shuttle_escapees++ + + //Round statistics report + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) + + parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" + parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]" + var/total_players = GLOB.joined_player_list.len + if(total_players) + parts+= "[GLOB.TAB]Total Population: [total_players]" + if(station_evacuated) + parts += "
[GLOB.TAB]Evacuation Rate: [num_escapees] ([PERCENT(num_escapees/total_players)]%)" + parts += "[GLOB.TAB](on emergency shuttle): [num_shuttle_escapees] ([PERCENT(num_shuttle_escapees/total_players)]%)" + parts += "[GLOB.TAB]Survival Rate: [num_survivors] ([PERCENT(num_survivors/total_players)]%)" + return parts.Join("
") + +/datum/controller/subsystem/ticker/proc/show_roundend_report(client/C,common_report) + var/list/report_parts = list() + + report_parts += personal_report(C) + report_parts += common_report + + var/datum/browser/roundend_report = new(C, "roundend") + roundend_report.width = 800 + roundend_report.height = 600 + roundend_report.set_content(report_parts.Join()) + roundend_report.stylesheets = list() + roundend_report.add_stylesheet("roundend",'html/browser/roundend.css') + + roundend_report.open(0) + +/datum/controller/subsystem/ticker/proc/personal_report(client/C) + var/list/parts = list() + var/mob/M = C.mob + if(M.mind && !isnewplayer(M)) + if(M.stat != DEAD && !isbrain(M)) + if(EMERGENCY_ESCAPED_OR_ENDGAMED) + if(!M.onCentCom() || !M.onSyndieBase()) + parts += "
" + parts += "You managed to survive, but were marooned on [station_name()]..." + else + parts += "
" + parts += "You managed to survive the events on [station_name()] as [M.real_name]." + else + parts += "
" + parts += "You managed to survive the events on [station_name()] as [M.real_name]." + + else + parts += "
" + parts += "You did not survive the events on [station_name()]..." + else + parts += "
" + parts += "
" + if(GLOB.survivor_report) + parts += GLOB.survivor_report + else + parts += survivor_report() + + parts += "
" + + return parts.Join() + +/datum/controller/subsystem/ticker/proc/display_report() + GLOB.common_report = build_roundend_report() + for(var/client/C in GLOB.clients) + show_roundend_report(C,GLOB.common_report) + give_show_report_button(C) + CHECK_TICK + +/datum/controller/subsystem/ticker/proc/law_report() + var/list/parts = list() + //Silicon laws report + for (var/i in GLOB.ai_list) + var/mob/living/silicon/ai/aiPlayer = i + if(aiPlayer.mind) + parts += "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was deactivated"] were:" + parts += aiPlayer.laws.get_law_list(include_zeroth=TRUE) + + parts += "Total law changes: [aiPlayer.law_change_counter]" + + if (aiPlayer.connected_robots.len) + var/robolist = "[aiPlayer.real_name]'s minions were: " + for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) + if(robo.mind) + robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" + parts += "[robolist]" + + for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs) + if (!robo.connected_ai && robo.mind) + if (robo.stat != DEAD) + parts += "[robo.name] (Played by: [robo.mind.key]) survived as an AI-less borg! Its laws were:" + else + parts += "[robo.name] (Played by: [robo.mind.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:" + + if(robo) //How the hell do we lose robo between here and the world messages directly above this? + parts += robo.laws.get_law_list(include_zeroth=TRUE) + if(parts.len) + return "
[parts.Join("
")]
" + else + return "" + +/datum/controller/subsystem/ticker/proc/goal_report() + var/list/parts = list() + if(mode.station_goals.len) + for(var/V in mode.station_goals) + var/datum/station_goal/G = V + parts += G.get_result() + return "
    [parts.Join()]
" + +/datum/controller/subsystem/ticker/proc/medal_report() + if(GLOB.commendations.len) + var/list/parts = list() + parts += "Medal Commendations:" + for (var/com in GLOB.commendations) + parts += com + return "
[parts.Join("
")]
" + return "" + +/datum/controller/subsystem/ticker/proc/antag_report() + var/list/result = list() + var/list/all_teams = list() + var/list/all_antagonists = list() + + for(var/datum/antagonist/A in GLOB.antagonists) + all_teams |= A.get_team() + all_antagonists += A + + for(var/datum/objective_team/T in all_teams) + result += T.roundend_report() + for(var/datum/antagonist/X in all_antagonists) + if(X.get_team() == T) + all_antagonists -= X + result += " "//newline between teams + + var/currrent_category + var/datum/antagonist/previous_category + + sortTim(all_antagonists, /proc/cmp_antag_category) + + for(var/datum/antagonist/A in all_antagonists) + if(!A.show_in_roundend) + continue + if(A.roundend_category != currrent_category) + if(previous_category) + result += previous_category.roundend_report_footer() + result += "
" + result += "
" + result += A.roundend_report_header() + currrent_category = A.roundend_category + previous_category = A + result += A.roundend_report() + result += "
" + + if(all_antagonists.len) + var/datum/antagonist/last = all_antagonists[all_antagonists.len] + result += last.roundend_report_footer() + result += "
" + + return result.Join() + +/proc/cmp_antag_category(datum/antagonist/A,datum/antagonist/B) + return sorttext(B.roundend_category,A.roundend_category) + + +/datum/controller/subsystem/ticker/proc/give_show_report_button(client/C) + var/datum/action/report/R = new + C.player_details.player_actions += R + R.Grant(C.mob) + to_chat(C,"Show roundend report again") + +/datum/action/report + name = "Show roundend report" + button_icon_state = "vote" + +/datum/action/report/Trigger() + if(owner && GLOB.common_report && SSticker.current_state == GAME_STATE_FINISHED) + SSticker.show_roundend_report(owner.client,GLOB.common_report) + +/datum/action/report/IsAvailable() + return 1 + +/datum/action/report/Topic(href,href_list) + if(usr != owner) + return + if(href_list["report"]) + Trigger() + return + + +/proc/printplayer(datum/mind/ply, fleecheck) + var/text = "[ply.key] was [ply.name] the [ply.assigned_role] and" + if(ply.current) + if(ply.current.stat == DEAD) + text += " died" + else + text += " survived" + if(fleecheck) + var/turf/T = get_turf(ply.current) + if(!T || !(T.z in GLOB.station_z_levels)) + text += " while fleeing the station" + if(ply.current.real_name != ply.name) + text += " as [ply.current.real_name]" + else + text += " had their body destroyed" + return text + +/proc/printplayerlist(list/players,fleecheck) + var/list/parts = list() + + parts += "
    " + for(var/datum/mind/M in players) + parts += "
  • [printplayer(M,fleecheck)]
  • " + parts += "
" + return parts.Join() + + +/proc/printobjectives(datum/mind/ply) + var/list/objective_parts = list() + var/count = 1 + for(var/datum/objective/objective in ply.objectives) + if(objective.check_completion()) + objective_parts += "Objective #[count]: [objective.explanation_text] Success!" + else + objective_parts += "Objective #[count]: [objective.explanation_text] Fail." + count++ + return objective_parts.Join("
") \ No newline at end of file diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 9c3af923f1..3822f7077d 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,18 +1,12 @@ GLOBAL_VAR_INIT(master_mode, "traitor") //"extended" GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode +GLOBAL_VAR(common_report) //Contains commmon part of roundend report +GLOBAL_VAR(survivor_report) //Contains shared surivor report for roundend report (part of personal report) + GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report -// Cult, needs to be global so admin cultists are functional -GLOBAL_VAR_INIT(blood_target, null) // Cult Master's target or Construct's Master -GLOBAL_DATUM(blood_target_image, /image) -GLOBAL_VAR_INIT(blood_target_reset_timer, null) -GLOBAL_DATUM(sac_mind, /datum/mind) -GLOBAL_VAR_INIT(sac_image, null) -GLOBAL_VAR_INIT(cult_vote_called, FALSE) -GLOBAL_VAR_INIT(cult_mastered, FALSE) -GLOBAL_VAR_INIT(reckoning_complete, FALSE) -GLOBAL_VAR_INIT(sac_complete, FALSE) -GLOBAL_DATUM(cult_narsie, /obj/singularity/narsie/large/cult) -GLOBAL_LIST_EMPTY(summon_spots) \ No newline at end of file + +//TODO clear this one up too +GLOBAL_DATUM(cult_narsie, /obj/singularity/narsie/large/cult) \ No newline at end of file diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index bb86b4cbb0..8b8b817586 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -16,3 +16,5 @@ GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a perce GLOBAL_LIST_EMPTY(powernets) GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes + +GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details \ No newline at end of file diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 0006d72d3b..2ad2eb76f5 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -302,32 +302,41 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /obj/screen/alert/bloodsense/process() var/atom/blood_target - if(GLOB.blood_target) - if(!get_turf(GLOB.blood_target)) - GLOB.blood_target = null + + var/datum/antagonist/cult/antag = mob_viewer.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!antag) + return + var/datum/objective/sacrifice/sac_objective = locate() in antag.cult_team.objectives + + if(antag.cult_team.blood_target) + if(!get_turf(antag.cult_team.blood_target)) + antag.cult_team.blood_target = null else - blood_target = GLOB.blood_target + blood_target = antag.cult_team.blood_target if(Cviewer && Cviewer.seeking && Cviewer.master) blood_target = Cviewer.master desc = "Your blood sense is leading you to [Cviewer.master]" if(!blood_target) - if(!GLOB.sac_complete) + if(sac_objective && !sac_objective.check_completion()) if(icon_state == "runed_sense0") return animate(src, transform = null, time = 1, loop = 0) angle = 0 cut_overlays() icon_state = "runed_sense0" - desc = "Nar-Sie demands that [GLOB.sac_mind] be sacrificed before the summoning ritual can begin." - add_overlay(GLOB.sac_image) + desc = "Nar-Sie demands that [sac_objective.target] be sacrificed before the summoning ritual can begin." + add_overlay(sac_objective.sac_image) else + var/datum/objective/eldergod/summon_objective = locate() in antag.cult_team.objectives + if(!summon_objective) + return if(icon_state == "runed_sense1") return animate(src, transform = null, time = 1, loop = 0) angle = 0 cut_overlays() icon_state = "runed_sense1" - desc = "The sacrifice is complete, summon Nar-Sie! The summoning can only take place in [english_list(GLOB.summon_spots)]!" + desc = "The sacrifice is complete, summon Nar-Sie! The summoning can only take place in [english_list(summon_objective.summon_spots)]!" add_overlay(narnar) return var/turf/P = get_turf(blood_target) @@ -388,11 +397,13 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." desc = "CHETR
NYY
HAGEHUGF-NAQ-UBABE
RATVAR.
" else var/servants = 0 - var/list/textlist + var/list/textlist = list() for(var/mob/living/L in GLOB.alive_mob_list) if(is_servant_of_ratvar(L)) servants++ - textlist = list("[SSticker.mode.eminence ? "There is an Eminence." : "There is no Eminence! Get one ASAP!"]
") + var/datum/antagonist/clockcult/C = mob_viewer.mind.has_antag_datum(/datum/antagonist/clockcult,TRUE) + if(C && C.clock_team) + textlist += "[C.clock_team.eminence ? "There is an Eminence." : "There is no Eminence! Get one ASAP!"]
" textlist += "There are currently [servants] servant[servants > 1 ? "s" : ""] of Ratvar.
" for(var/i in SSticker.scripture_states) if(i != SCRIPTURE_DRIVER) //ignore the always-unlocked stuff diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 941fcbbcd6..e638de668e 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -10,7 +10,8 @@ SUBSYSTEM_DEF(blackbox) var/sealed = FALSE //time to stop tracking stats? var/list/research_levels = list() //list of highest tech levels attained that isn't lost lost by destruction of RD computers var/list/versions = list("time_dilation_current" = 2, - "science_techweb_unlock" = 2) //associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this + "science_techweb_unlock" = 2, + "antagonists" = 3) //associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this /datum/controller/subsystem/blackbox/Initialize() @@ -225,7 +226,10 @@ Versioning var/pos = length(FV.json["data"]) + 1 FV.json["data"]["[pos]"] = list() //in 512 "pos" can be replaced with "[FV.json["data"].len+1]" for(var/i in data) - FV.json["data"]["[pos]"]["[i]"] = "[data[i]]" //and here with "[FV.json["data"].len]" + if(islist(data[i])) + FV.json["data"]["[pos]"]["[i]"] = data[i] //and here with "[FV.json["data"].len]" + else + FV.json["data"]["[pos]"]["[i]"] = "[data[i]]" else CRASH("Invalid feedback key_type: [key_type]") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 881bb7fcb7..f178a1bd24 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -398,6 +398,7 @@ SUBSYSTEM_DEF(ticker) var/mob/living/L = I L.notransform = FALSE +<<<<<<< HEAD /datum/controller/subsystem/ticker/proc/declare_completion() set waitfor = FALSE var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED @@ -596,6 +597,8 @@ SUBSYSTEM_DEF(ticker) else CRASH("Attempted standard reboot without ticker roundend completion") +======= +>>>>>>> 3d81385... Roundend report refactor (#33246) /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m if(selected_tip) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 55624a866c..0ce136f83b 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -206,6 +206,7 @@ SUBSYSTEM_DEF(vote) var/datum/action/vote/V = new if(question) V.name = "Vote: [question]" + C.player_details.player_actions += V V.Grant(C.mob) generated_actions += V return 1 @@ -299,6 +300,7 @@ SUBSYSTEM_DEF(vote) for(var/v in generated_actions) var/datum/action/vote/V = v if(!QDELETED(V)) + V.remove_from_client() V.Remove(V.owner) generated_actions = list() @@ -318,7 +320,16 @@ SUBSYSTEM_DEF(vote) /datum/action/vote/Trigger() if(owner) owner.vote() + remove_from_client() Remove(owner) /datum/action/vote/IsAvailable() return 1 + +/datum/action/vote/proc/remove_from_client() + if(owner.client) + owner.client.player_details.player_actions -= src + else if(owner.ckey) + var/datum/player_details/P = GLOB.player_details[owner.ckey] + if(P) + P.player_actions -= src \ No newline at end of file diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 8d86507271..c12a08a792 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -373,32 +373,9 @@ ion = list() /datum/ai_laws/proc/show_laws(who) - - if (devillaws && devillaws.len) //Yes, devil laws go in FRONT of zeroth laws, as the devil must still obey it's ban/obligation. - for(var/i in devillaws) - to_chat(who, "666. [i]") - - if (zeroth) - to_chat(who, "0. [zeroth]") - - for (var/index = 1, index <= ion.len, index++) - var/law = ion[index] - var/num = ionnum() - to_chat(who, "[num]. [law]") - - var/number = 1 - for (var/index = 1, index <= inherent.len, index++) - var/law = inherent[index] - - if (length(law) > 0) - to_chat(who, "[number]. [law]") - number++ - - for (var/index = 1, index <= supplied.len, index++) - var/law = supplied[index] - if (length(law) > 0) - to_chat(who, "[number]. [law]") - number++ + var/list/printable_laws = get_law_list(include_zeroth = TRUE) + for(var/law in printable_laws) + to_chat(who,law) /datum/ai_laws/proc/clear_zeroth_law(force) //only removes zeroth from antag ai if force is 1 if(force) diff --git a/code/datums/antagonists/abductor.dm b/code/datums/antagonists/abductor.dm index 8d13c48e7c..3b8935d9fa 100644 --- a/code/datums/antagonists/abductor.dm +++ b/code/datums/antagonists/abductor.dm @@ -1,5 +1,6 @@ /datum/antagonist/abductor name = "Abductor" + roundend_category = "abductors" job_rank = ROLE_ABDUCTOR var/datum/objective_team/abductor_team/team var/sub_role @@ -70,3 +71,65 @@ var/mob/living/carbon/human/H = owner.current var/datum/species/abductor/A = H.dna.species A.scientist = TRUE + + +/datum/objective_team/abductor_team + member_name = "abductor" + var/team_number + var/list/datum/mind/abductees = list() + +/datum/objective_team/abductor_team/is_solo() + return FALSE + +/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) + O.team = src + O.update_explanation_text() + objectives += O + +/datum/objective_team/abductor_team/roundend_report() + var/list/result = list() + + var/won = TRUE + for(var/datum/objective/O in objectives) + if(!O.check_completion()) + won = FALSE + if(won) + result += "[name] team fulfilled its mission!" + else + result += "[name] team failed its mission." + + result += "The abductors of [name] were:" + for(var/datum/mind/abductor_mind in members) + result += printplayer(abductor_mind) + result += printobjectives(abductor_mind) + + return result.Join("
") + + +/datum/antagonist/abductee + name = "Abductee" + roundend_category = "abductees" + +/datum/antagonist/abductee/on_gain() + give_objective() + . = ..() + +/datum/antagonist/abductee/greet() + to_chat(owner, "Your mind snaps!") + to_chat(owner, "You can't remember how you got here...") + owner.announce_objectives() + +/datum/antagonist/abductee/proc/give_objective() + var/mob/living/carbon/human/H = owner.current + if(istype(H)) + H.gain_trauma_type(BRAIN_TRAUMA_MILD) + var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) + var/datum/objective/abductee/O = new objtype() + objectives += O + owner.objectives += objectives + +/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) + SSticker.mode.update_abductor_icons_added(mob_override ? mob_override.mind : owner) + +/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) + SSticker.mode.update_abductor_icons_removed(mob_override ? mob_override.mind : owner) \ No newline at end of file diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm index 0a7b2aa22f..6b5a573eff 100644 --- a/code/datums/antagonists/antag_datum.dm +++ b/code/datums/antagonists/antag_datum.dm @@ -2,6 +2,8 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist var/name = "Antagonist" + var/roundend_category = "other antagonists" //Section of roundend report, datums with same category will be displayed together, also default header for the section + var/show_in_roundend = TRUE //Set to false to hide the antagonists from roundend report var/datum/mind/owner //Mind that owns this datum var/silent = FALSE //Silent will prevent the gain/lose texts to show var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum @@ -9,6 +11,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/delete_on_mind_deletion = TRUE var/job_rank var/replace_banned = TRUE //Should replace jobbaned player with ghosts if granted. + var/list/objectives = list() /datum/antagonist/New(datum/mind/new_owner) GLOB.antagonists += src @@ -96,9 +99,62 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/get_team() return +//Individual roundend report +/datum/antagonist/proc/roundend_report() + var/list/report = list() + + if(!owner) + CRASH("antagonist datum without owner") + + report += printplayer(owner) + + var/objectives_complete = TRUE + if(owner.objectives.len) + report += printobjectives(owner) + for(var/datum/objective/objective in owner.objectives) + if(!objective.check_completion()) + objectives_complete = FALSE + break + + if(owner.objectives.len == 0 || objectives_complete) + report += "The [name] was successful!" + else + report += "The [name] has failed!" + + return report.Join("
") + +//Displayed at the start of roundend_category section, default to roundend_category header +/datum/antagonist/proc/roundend_report_header() + return "The [roundend_category] were:
" + +//Displayed at the end of roundend_category section +/datum/antagonist/proc/roundend_report_footer() + return + //Should probably be on ticker or job ss ? /proc/get_antagonists(antag_type,specific = FALSE) . = list() for(var/datum/antagonist/A in GLOB.antagonists) if(!specific && istype(A,antag_type) || specific && A.type == antag_type) - . += A.owner \ No newline at end of file + . += A.owner + + + +//This datum will autofill the name with special_role +//Used as placeholder for minor antagonists, please create proper datums for these +/datum/antagonist/auto_custom + +/datum/antagonist/auto_custom/on_gain() + ..() + name = owner.special_role + //Add all objectives not already owned by other datums to this one. + var/list/already_registered_objectives = list() + for(var/datum/antagonist/A in owner.antag_datums) + if(A == src) + continue + else + already_registered_objectives |= A.objectives + objectives = owner.objectives - already_registered_objectives + +//This one is created by admin tools for custom objectives +/datum/antagonist/custom \ No newline at end of file diff --git a/code/datums/antagonists/brother.dm b/code/datums/antagonists/brother.dm index 6458e6da09..dd3bdef9d2 100644 --- a/code/datums/antagonists/brother.dm +++ b/code/datums/antagonists/brother.dm @@ -55,3 +55,71 @@ /datum/antagonist/brother/proc/finalize_brother() SSticker.mode.update_brother_icons_added(owner) + + +/datum/objective_team/brother_team + name = "brotherhood" + member_name = "blood brother" + var/meeting_area + +/datum/objective_team/brother_team/is_solo() + return FALSE + +/datum/objective_team/brother_team/proc/update_name() + var/list/last_names = list() + for(var/datum/mind/M in members) + var/list/split_name = splittext(M.name," ") + last_names += split_name[split_name.len] + + name = last_names.Join(" & ") + +/datum/objective_team/brother_team/roundend_report() + var/list/parts = list() + + parts += "The blood brothers of [name] were:" + for(var/datum/mind/M in members) + parts += printplayer(M) + var/win = TRUE + var/objective_count = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + parts += "Objective #[objective_count]: [objective.explanation_text] Success!" + else + parts += "Objective #[objective_count]: [objective.explanation_text] Fail." + win = FALSE + objective_count++ + if(win) + parts += "The blood brothers were successful!" + else + parts += "The blood brothers have failed!" + + return "
[parts.Join("
")]
" + +/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) + O.team = src + if(needs_target) + O.find_target() + O.update_explanation_text() + objectives += O + +/datum/objective_team/brother_team/proc/forge_brother_objectives() + objectives = list() + var/is_hijacker = prob(10) + for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) + forge_single_objective() + if(is_hijacker) + if(!locate(/datum/objective/hijack) in objectives) + add_objective(new/datum/objective/hijack) + else if(!locate(/datum/objective/escape) in objectives) + add_objective(new/datum/objective/escape) + +/datum/objective_team/brother_team/proc/forge_single_objective() + if(prob(50)) + if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) + add_objective(new/datum/objective/destroy, TRUE) + else if(prob(30)) + add_objective(new/datum/objective/maroon, TRUE) + else + add_objective(new/datum/objective/assassinate, TRUE) + else + add_objective(new/datum/objective/steal, TRUE) \ No newline at end of file diff --git a/code/datums/antagonists/changeling.dm b/code/datums/antagonists/changeling.dm index e98bfed782..4f8af2dc8a 100644 --- a/code/datums/antagonists/changeling.dm +++ b/code/datums/antagonists/changeling.dm @@ -4,11 +4,11 @@ /datum/antagonist/changeling name = "Changeling" + roundend_category = "changelings" job_rank = ROLE_CHANGELING var/you_are_greet = TRUE var/give_objectives = TRUE - var/list/objectives = list() var/team_mode = FALSE //Should assign team objectives ? //Changeling Stuff @@ -478,4 +478,35 @@ /datum/antagonist/changeling/xenobio name = "Xenobio Changeling" give_objectives = FALSE + show_in_roundend = FALSE //These are here for admin tracking purposes only you_are_greet = FALSE + +/datum/antagonist/changeling/roundend_report() + var/list/parts = list() + + var/changelingwin = 1 + if(!owner.current) + changelingwin = 0 + + parts += printplayer(owner) + + //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. + parts += "Changeling ID: [changelingID]." + parts += "Genomes Extracted: [absorbedcount]" + parts += " " + if(objectives.len) + var/count = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + parts += "Objective #[count]: [objective.explanation_text] Success!
" + else + parts += "Objective #[count]: [objective.explanation_text] Fail." + changelingwin = 0 + count++ + + if(changelingwin) + parts += "The changeling was successful!" + else + parts += "The changeling has failed." + + return parts.Join("
") \ No newline at end of file diff --git a/code/datums/antagonists/clockcult.dm b/code/datums/antagonists/clockcult.dm index 8cc1c9e9a7..5f99ccc5dd 100644 --- a/code/datums/antagonists/clockcult.dm +++ b/code/datums/antagonists/clockcult.dm @@ -1,8 +1,11 @@ //CLOCKCULT PROOF OF CONCEPT /datum/antagonist/clockcult name = "Clock Cultist" - var/datum/action/innate/hierophant/hierophant_network = new() + roundend_category = "clock cultists" job_rank = ROLE_SERVANT_OF_RATVAR + var/datum/action/innate/hierophant/hierophant_network = new() + var/datum/objective_team/clockcult/clock_team + var/make_team = TRUE //This should be only false for tutorial scarabs /datum/antagonist/clockcult/silent silent = TRUE @@ -11,6 +14,22 @@ qdel(hierophant_network) return ..() +/datum/antagonist/clockcult/get_team() + return clock_team + +/datum/antagonist/clockcult/create_team(datum/objective_team/clockcult/new_team) + if(!new_team && make_team) + //TODO blah blah same as the others, allow multiple + for(var/datum/antagonist/clockcult/H in GLOB.antagonists) + if(H.clock_team) + clock_team = H.clock_team + return + clock_team = new /datum/objective_team/clockcult + return + if(make_team && !istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + clock_team = new_team + /datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) . = ..() if(.) @@ -164,3 +183,35 @@ if(iscyborg(owner.current)) to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") . = ..() + + +/datum/objective_team/clockcult + name = "Clockcult" + var/list/objective + var/datum/mind/eminence + +/datum/objective_team/clockcult/proc/check_clockwork_victory() + if(GLOB.clockwork_gateway_activated) + return TRUE + return FALSE + +/datum/objective_team/clockcult/roundend_report() + var/list/parts = list() + + if(check_clockwork_victory()) + parts += "Ratvar's servants defended the Ark until its activation!" + else + parts += "The Ark was destroyed! Ratvar will rust away for all eternity!" + parts += " " + parts += "The servants' objective was: [CLOCKCULT_OBJECTIVE]." + parts += "Construction Value(CV) was: [GLOB.clockwork_construction_value]" + for(var/i in SSticker.scripture_states) + if(i != SCRIPTURE_DRIVER) + parts += "[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" + if(eminence) + parts += "The Eminence was: [printplayer(eminence)]" + if(members.len) + parts += "Ratvar's servants were:" + parts += printplayerlist(members - eminence) + + return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/antagonists/cult.dm b/code/datums/antagonists/cult.dm index c26b0f8108..bce9123fb3 100644 --- a/code/datums/antagonists/cult.dm +++ b/code/datums/antagonists/cult.dm @@ -2,84 +2,103 @@ /datum/antagonist/cult name = "Cultist" + roundend_category = "cultists" var/datum/action/innate/cult/comm/communion = new var/datum/action/innate/cult/mastervote/vote = new job_rank = ROLE_CULTIST var/ignore_implant = FALSE + var/give_equipment = FALSE + + var/datum/objective_team/cult/cult_team + +/datum/antagonist/cult/get_team() + return cult_team + +/datum/antagonist/cult/create_team(datum/objective_team/cult/new_team) + if(!new_team) + //todo remove this and allow admin buttons to create more than one cult + for(var/datum/antagonist/cult/H in GLOB.antagonists) + if(H.cult_team) + cult_team = H.cult_team + return + cult_team = new /datum/objective_team/cult + cult_team.setup_objectives() + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + cult_team = new_team + +/datum/antagonist/cult/proc/add_objectives() + objectives |= cult_team.objectives + owner.objectives |= objectives + +/datum/antagonist/cult/proc/remove_objectives() + owner.objectives -= objectives /datum/antagonist/cult/Destroy() QDEL_NULL(communion) QDEL_NULL(vote) return ..() -/datum/antagonist/cult/proc/add_objectives() - var/list/target_candidates = list() - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && (player != owner) && player.stat != DEAD) - target_candidates += player.mind - if(target_candidates.len == 0) - message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && (player != owner) && player.stat != DEAD) - target_candidates += player.mind - listclearnulls(target_candidates) - if(LAZYLEN(target_candidates)) - GLOB.sac_mind = pick(target_candidates) - if(!GLOB.sac_mind) - message_admins("Cult Sacrifice: ERROR - Null target chosen!") - else - var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role) - var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) - reshape.Shift(SOUTH, 4) - reshape.Shift(EAST, 1) - reshape.Crop(7,4,26,31) - reshape.Crop(-5,-3,26,30) - GLOB.sac_image = reshape - else - message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") - GLOB.sac_complete = TRUE - SSticker.mode.cult_objectives += "sacrifice" - if(!GLOB.summon_spots.len) - while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES) - var/area/summon = pick(GLOB.sortedAreas - GLOB.summon_spots) - if(summon && (summon.z in GLOB.station_z_levels) && summon.valid_territory) - GLOB.summon_spots += summon - SSticker.mode.cult_objectives += "eldergod" - -/datum/antagonist/cult/proc/cult_memorization(datum/mind/cult_mind) - var/mob/living/current = cult_mind.current - for(var/obj_count = 1,obj_count <= SSticker.mode.cult_objectives.len,obj_count++) - var/explanation - switch(SSticker.mode.cult_objectives[obj_count]) - if("sacrifice") - if(GLOB.sac_mind) - explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." - else - explanation = "The veil has already been weakened here, proceed to the final objective." - GLOB.sac_complete = TRUE - if("eldergod") - explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(GLOB.summon_spots)] - where the veil is weak enough for the ritual to begin." - if(!silent) - to_chat(current, "Objective #[obj_count]: [explanation]") - cult_mind.memory += "Objective #[obj_count]: [explanation]
" - /datum/antagonist/cult/can_be_owned(datum/mind/new_owner) . = ..() if(. && !ignore_implant) - . = is_convertable_to_cult(new_owner.current) + . = is_convertable_to_cult(new_owner.current,cult_team) + +/datum/antagonist/cult/greet() + to_chat(owner, "You are a member of the cult!") + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change + owner.announce_objectives() /datum/antagonist/cult/on_gain() . = ..() var/mob/living/current = owner.current - if(!LAZYLEN(SSticker.mode.cult_objectives)) - add_objectives() + add_objectives() + if(give_equipment) + equip_cultist() SSticker.mode.cult += owner // Only add after they've been given objectives - cult_memorization(owner) SSticker.mode.update_cult_icons_added(owner) current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - if(GLOB.blood_target && GLOB.blood_target_image && current.client) - current.client.images += GLOB.blood_target_image + + if(cult_team.blood_target && cult_team.blood_target_image && current.client) + current.client.images += cult_team.blood_target_image + + +/datum/antagonist/cult/proc/equip_cultist(tome=FALSE) + var/mob/living/carbon/H = owner.current + if(!istype(H)) + return + if (owner.assigned_role == "Clown") + to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + H.dna.remove_mutation(CLOWNMUT) + + if(tome) + . += cult_give_item(/obj/item/tome, H) + else + . += cult_give_item(/obj/item/paper/talisman/supply, H) + to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") + + +/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) + var/list/slots = list( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store + ) + + var/T = new item_path(mob) + var/item_name = initial(item_path.name) + var/where = mob.equip_in_one_of_slots(T, slots) + if(!where) + to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") + return 0 + else + to_chat(mob, "You have a [item_name] in your [where].") + if(where == "backpack") + var/obj/item/storage/B = mob.back + B.orient2hud(mob) + B.show_to(mob) + return 1 /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) . = ..() @@ -89,7 +108,7 @@ current.faction |= "cult" current.grant_language(/datum/language/narsie) current.verbs += /mob/living/proc/cult_help - if(!GLOB.cult_mastered) + if(!cult_team.cult_mastered) vote.Grant(current) communion.Grant(current) current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) @@ -107,6 +126,7 @@ current.clear_alert("bloodsense") /datum/antagonist/cult/on_removal() + remove_objectives() owner.wipe_memory() SSticker.mode.cult -= owner SSticker.mode.update_cult_icons_removed(owner) @@ -114,8 +134,8 @@ owner.current.visible_message("[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!", ignored_mob = owner.current) to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - if(GLOB.blood_target && GLOB.blood_target_image && owner.current.client) - owner.current.client.images -= GLOB.blood_target_image + if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) + owner.current.client.images -= cult_team.blood_target_image . = ..() /datum/antagonist/cult/master @@ -145,7 +165,7 @@ var/mob/living/current = owner.current if(mob_override) current = mob_override - if(!GLOB.reckoning_complete) + if(!cult_team.reckoning_complete) reckoning.Grant(current) bloodmark.Grant(current) throwing.Grant(current) @@ -162,3 +182,118 @@ throwing.Remove(current) current.update_action_buttons_icon() current.remove_status_effect(/datum/status_effect/cult_master) + +/datum/objective_team/cult + name = "Cult" + + var/blood_target + var/image/blood_target_image + var/blood_target_reset_timer + + var/cult_vote_called = FALSE + var/cult_mastered = FALSE + var/reckoning_complete = FALSE + + +/datum/objective_team/cult/proc/setup_objectives() + //SAC OBJECTIVE , todo: move this to objective internals + var/list/target_candidates = list() + var/datum/objective/sacrifice/sac_objective = new + sac_objective.team = src + + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && player.stat != DEAD) + target_candidates += player.mind + + if(target_candidates.len == 0) + message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && player.stat != DEAD) + target_candidates += player.mind + listclearnulls(target_candidates) + if(LAZYLEN(target_candidates)) + sac_objective.target = pick(target_candidates) + sac_objective.update_explanation_text() + + var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role) + var/datum/preferences/sacface = sac_objective.target.current.client.prefs + var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) + reshape.Shift(SOUTH, 4) + reshape.Shift(EAST, 1) + reshape.Crop(7,4,26,31) + reshape.Crop(-5,-3,26,30) + sac_objective.sac_image = reshape + + objectives += sac_objective + else + message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") + + + //SUMMON OBJECTIVE + + var/datum/objective/eldergod/summon_objective = new() + summon_objective.team = src + objectives += summon_objective + +/datum/objective/sacrifice + var/sacced = FALSE + var/sac_image + +/datum/objective/sacrifice/check_completion() + return sacced || completed + +/datum/objective/sacrifice/update_explanation_text() + if(target && !sacced) + explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." + else + explanation_text = "The veil has already been weakened here, proceed to the final objective." + +/datum/objective/eldergod + var/summoned = FALSE + var/list/summon_spots = list() + +/datum/objective/eldergod/New() + ..() + var/sanity = 0 + while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) + var/area/summon = pick(GLOB.sortedAreas - summon_spots) + if(summon && (summon.z in GLOB.station_z_levels) && summon.valid_territory) + summon_spots += summon + sanity++ + update_explanation_text() + +/datum/objective/eldergod/update_explanation_text() + explanation_text = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." + +/datum/objective/eldergod/check_completion() + return summoned || completed + +/datum/objective_team/cult/proc/check_cult_victory() + for(var/datum/objective/O in objectives) + if(!O.check_completion()) + return FALSE + return TRUE + +/datum/objective_team/cult/roundend_report() + var/list/parts = list() + + if(check_cult_victory()) + parts += "The cult has succeeded! Nar-sie has snuffed out another torch in the void!" + else + parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!" + + if(objectives.len) + parts += "The cultists' objectives were:" + var/count = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + parts += "Objective #[count]: [objective.explanation_text] Success!" + else + parts += "Objective #[count]: [objective.explanation_text] Fail." + count++ + + if(members.len) + parts += "The cultists were:" + parts += printplayerlist(members) + + return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm index d386c79c25..3ccdc7ddfb 100644 --- a/code/datums/antagonists/datum_traitor.dm +++ b/code/datums/antagonists/datum_traitor.dm @@ -1,5 +1,6 @@ /datum/antagonist/traitor name = "Traitor" + roundend_category = "traitors" job_rank = ROLE_TRAITOR var/should_specialise = FALSE //do we split into AI and human, set to true on inital assignment only var/ai_datum = ANTAG_DATUM_TRAITOR_AI @@ -8,7 +9,6 @@ var/employer = "The Syndicate" var/give_objectives = TRUE var/should_give_codewords = TRUE - var/list/objectives_given = list() /datum/antagonist/traitor/human var/should_equip = TRUE @@ -52,9 +52,9 @@ if(should_specialise) return ..()//we never did any of this anyway SSticker.mode.traitors -= owner - for(var/O in objectives_given) + for(var/O in objectives) owner.objectives -= O - objectives_given = list() + objectives = list() if(!silent && owner.current) to_chat(owner.current," You are no longer the [special_role]! ") owner.special_role = null @@ -71,11 +71,11 @@ /datum/antagonist/traitor/proc/add_objective(var/datum/objective/O) owner.objectives += O - objectives_given += O + objectives += O /datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O) owner.objectives -= O - objectives_given -= O + objectives -= O /datum/antagonist/traitor/proc/forge_traitor_objectives() return @@ -294,3 +294,53 @@ where = "In your [equipped_slot]" to_chat(mob, "

[where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
") +//TODO Collate +/datum/antagonist/traitor/roundend_report() + var/list/result = list() + + var/traitorwin = TRUE + + result += printplayer(owner) + + var/TC_uses = 0 + var/uplink_true = FALSE + var/purchases = "" + for(var/datum/component/uplink/H in GLOB.uplinks) + if(H && H.owner && H.owner == owner.key) + TC_uses += H.spent_telecrystals + uplink_true = TRUE + purchases += H.purchase_log.generate_render(FALSE) + + var/objectives_text = "" + if(objectives.len)//If the traitor had no objectives, don't need to process this. + var/count = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" + else + objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." + traitorwin = FALSE + count++ + + if(uplink_true) + var/uplink_text = "(used [TC_uses] TC) [purchases]" + if(TC_uses==0 && traitorwin) + var/static/icon/badass = icon('icons/badass.dmi', "badass") + uplink_text += "[icon2html(badass, world)]" + result += uplink_text + + result += objectives_text + + var/special_role_text = lowertext(name) + + if(traitorwin) + result += "The [special_role_text] was successful!" + else + result += "The [special_role_text] has failed!" + SEND_SOUND(owner.current, 'sound/ambience/ambifailure.ogg') + + return result.Join("
") + +/datum/antagonist/traitor/roundend_report_footer() + return "
The code phrases were: [GLOB.syndicate_code_phrase]
\ + The code responses were: [GLOB.syndicate_code_response]
" \ No newline at end of file diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm index 416a8f3752..97e0d8c18a 100644 --- a/code/datums/antagonists/devil.dm +++ b/code/datums/antagonists/devil.dm @@ -86,6 +86,7 @@ GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")) /datum/antagonist/devil name = "Devil" + roundend_category = "devils" job_rank = ROLE_DEVIL //Don't delete upon mind destruction, otherwise soul re-selling will break. delete_on_mind_deletion = FALSE @@ -508,6 +509,35 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", owner.RemoveSpell(S) .=..() +/datum/antagonist/devil/proc/printdevilinfo() + var/list/parts = list() + parts += "The devil's true name is: [truename]" + parts += "The devil's bans were:" + parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" + parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" + parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" + parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" + return parts.Join("
") + +/datum/antagonist/devil/roundend_report() + var/list/parts = list() + parts += printplayer(owner) + parts += printdevilinfo() + parts += printobjectives(owner) + return parts.Join("
") + +/datum/antagonist/devil/roundend_report_footer() + //sintouched go here for now as a hack , TODO proper antag datum for these + var/list/parts = list() + if(SSticker.mode.sintouched.len) + parts += "The sintouched were:" + var/list/sintouchedUnique = uniqueList(SSticker.mode.sintouched) + for(var/S in sintouchedUnique) + var/datum/mind/sintouched_mind = S + parts += printplayer(sintouched_mind) + parts += printobjectives(sintouched_mind) + return parts.Join("
") + //A simple super light weight datum for the codex gigas. /datum/fakeDevil var/truename diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index ab4822dd79..8201cd879d 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -37,19 +37,20 @@ else if(M.assigned_role in GLOB.command_positions) possible_targets[M] = 1 //good-guy - var/list/objectives = list(1,2,3,4) - while(owner.objectives.len < quantity) - switch(pick_n_take(objectives)) + var/list/possible_objectives = list(1,2,3,4) + + while(objectives.len < quantity) + switch(pick_n_take(possible_objectives)) if(1) //research var/datum/objective/download/O = new /datum/objective/download() O.owner = owner O.gen_amount_goal() - owner.objectives += O + objectives += O if(2) //steal var/datum/objective/steal/special/O = new /datum/objective/steal/special() O.owner = owner - owner.objectives += O + objectives += O if(3) //protect/kill if(!possible_targets.len) continue @@ -63,13 +64,13 @@ O.owner = owner O.target = M O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." - owner.objectives += O + objectives += O else //protect var/datum/objective/protect/O = new /datum/objective/protect() O.owner = owner O.target = M O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." - owner.objectives += O + objectives += O if(4) //debrain/capture if(!possible_targets.len) continue var/selected = rand(1,possible_targets.len) @@ -82,17 +83,17 @@ O.owner = owner O.target = M O.explanation_text = "Steal the brain of [M.current.real_name]." - owner.objectives += O + objectives += O else //capture var/datum/objective/capture/O = new /datum/objective/capture() O.owner = owner O.gen_amount_goal() - owner.objectives += O + objectives += O else break var/datum/objective/O = new /datum/objective/survive() O.owner = owner - owner.objectives += O + owner.objectives |= objectives /proc/remove_ninja(mob/living/L) diff --git a/code/datums/antagonists/nukeop.dm b/code/datums/antagonists/nukeop.dm new file mode 100644 index 0000000000..d0f24e7d7b --- /dev/null +++ b/code/datums/antagonists/nukeop.dm @@ -0,0 +1,322 @@ +#define NUKE_RESULT_FLUKE 0 +#define NUKE_RESULT_NUKE_WIN 1 +#define NUKE_RESULT_CREW_WIN 2 +#define NUKE_RESULT_CREW_WIN_SYNDIES_DEAD 3 +#define NUKE_RESULT_DISK_LOST 4 +#define NUKE_RESULT_DISK_STOLEN 5 +#define NUKE_RESULT_NOSURVIVORS 6 +#define NUKE_RESULT_WRONG_STATION 7 +#define NUKE_RESULT_WRONG_STATION_DEAD 8 + +/datum/antagonist/nukeop + name = "Nuclear Operative" + roundend_category = "syndicate operatives" //just in case + job_rank = ROLE_OPERATIVE + var/datum/objective_team/nuclear/nuke_team + var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. + var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. + var/nukeop_outfit = /datum/outfit/syndicate + +/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.join_hud(M) + set_antag_hud(M, "synd") + +/datum/antagonist/nukeop/proc/update_synd_icons_removed(mob/living/M) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.leave_hud(M) + set_antag_hud(M, null) + +/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + update_synd_icons_added(M) + +/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + update_synd_icons_removed(M) + +/datum/antagonist/nukeop/proc/equip_op() + if(!ishuman(owner.current)) + return + var/mob/living/carbon/human/H = owner.current + + H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs + + H.equipOutfit(nukeop_outfit) + return TRUE + +/datum/antagonist/nukeop/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) + to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!") + owner.announce_objectives() + return + +/datum/antagonist/nukeop/on_gain() + give_alias() + forge_objectives() + . = ..() + equip_op() + memorize_code() + if(send_to_spawnpoint) + move_to_spawnpoint() + +/datum/antagonist/nukeop/get_team() + return nuke_team + +/datum/antagonist/nukeop/proc/assign_nuke() + if(nuke_team && !nuke_team.tracked_nuke) + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + nuke_team.tracked_nuke = nuke + if(nuke.r_code == "ADMIN") + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + else + stack_trace("Syndicate nuke not found during nuke team creation.") + nuke_team.memorized_code = null + +/datum/antagonist/nukeop/proc/give_alias() + if(nuke_team && nuke_team.syndicate_name) + var/number = 1 + number = nuke_team.members.Find(owner) + owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" + +/datum/antagonist/nukeop/proc/memorize_code() + if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) + owner.store_memory("[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]", 0, 0) + to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") + else + to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") + +/datum/antagonist/nukeop/proc/forge_objectives() + if(nuke_team) + owner.objectives |= nuke_team.objectives + +/datum/antagonist/nukeop/proc/move_to_spawnpoint() + var/team_number = 1 + if(nuke_team) + team_number = nuke_team.members.Find(owner) + owner.current.forceMove(GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1]) + +/datum/antagonist/nukeop/leader/move_to_spawnpoint() + owner.current.forceMove(pick(GLOB.nukeop_leader_start)) + +/datum/antagonist/nukeop/create_team(datum/objective_team/nuclear/new_team) + if(!new_team) + if(!always_new_team) + for(var/datum/antagonist/nukeop/N in GLOB.antagonists) + if(N.nuke_team) + nuke_team = N.nuke_team + return + nuke_team = new /datum/objective_team/nuclear + nuke_team.update_objectives() + assign_nuke() //This is bit ugly + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + nuke_team = new_team + +/datum/antagonist/nukeop/leader + name = "Nuclear Operative Leader" + nukeop_outfit = /datum/outfit/syndicate/leader + always_new_team = TRUE + var/title + +/datum/antagonist/nukeop/leader/memorize_code() + ..() + if(nuke_team && nuke_team.memorized_code) + var/obj/item/paper/P = new + P.info = "The nuclear authorization code is: [nuke_team.memorized_code]" + P.name = "nuclear bomb code" + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + P.forceMove(get_turf(H)) + else + H.put_in_hands(P, TRUE) + H.update_icons() + +/datum/antagonist/nukeop/leader/give_alias() + title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") + if(nuke_team && nuke_team.syndicate_name) + owner.current.real_name = "[nuke_team.syndicate_name] [title]" + else + owner.current.real_name = "Syndicate [title]" + +/datum/antagonist/nukeop/leader/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) + to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") + to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") + to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + owner.announce_objectives() + addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) + + +/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() + if(!nuke_team) + return + nuke_team.rename_team(ask_name()) + +/datum/objective_team/nuclear/proc/rename_team(new_name) + syndicate_name = new_name + name = "[syndicate_name] Team" + for(var/I in members) + var/datum/mind/synd_mind = I + var/mob/living/carbon/human/H = synd_mind.current + if(!istype(H)) + continue + var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name) + H.fully_replace_character_name(H.real_name,chosen_name) + +/datum/antagonist/nukeop/leader/proc/ask_name() + var/randomname = pick(GLOB.last_names) + var/newname = stripped_input(owner.current,"You are the nuke operative [title]. Please choose a last name for your family.", "Name change",randomname) + if (!newname) + newname = randomname + else + newname = reject_bad_name(newname) + if(!newname) + newname = randomname + + return capitalize(newname) + +/datum/antagonist/nukeop/lone + name = "Lone Operative" + always_new_team = TRUE + send_to_spawnpoint = FALSE //Handled by event + nukeop_outfit = /datum/outfit/syndicate/full + +/datum/antagonist/nukeop/lone/assign_nuke() + if(nuke_team && !nuke_team.tracked_nuke) + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list + if(nuke) + nuke_team.tracked_nuke = nuke + if(nuke.r_code == "ADMIN") + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + else + stack_trace("Station self destruct ot found during lone op team creation.") + nuke_team.memorized_code = null + +/datum/objective_team/nuclear + var/syndicate_name + var/obj/machinery/nuclearbomb/tracked_nuke + var/core_objective = /datum/objective/nuclear + var/memorized_code + +/datum/objective_team/nuclear/New() + ..() + syndicate_name = syndicate_name() + +/datum/objective_team/nuclear/proc/update_objectives() + if(core_objective) + var/datum/objective/O = new core_objective + O.team = src + objectives += O + +/datum/objective_team/nuclear/proc/disk_rescued() + for(var/obj/item/disk/nuclear/D in GLOB.poi_list) + if(!D.onCentCom()) + return FALSE + return TRUE + +/datum/objective_team/nuclear/proc/operatives_dead() + for(var/I in members) + var/datum/mind/operative_mind = I + if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) + return FALSE + return TRUE + +/datum/objective_team/nuclear/proc/syndies_escaped() + var/obj/docking_port/mobile/S = SSshuttle.getShuttle("syndicate") + return (S && (S.z == ZLEVEL_CENTCOM || S.z == ZLEVEL_TRANSIT)) + +/datum/objective_team/nuclear/proc/get_result() + var/evacuation = SSshuttle.emergency.mode == SHUTTLE_ENDGAME + var/disk_rescued = disk_rescued() + var/syndies_didnt_escape = !syndies_escaped() + var/station_was_nuked = SSticker.mode.station_was_nuked + var/nuke_off_station = SSticker.mode.nuke_off_station + + if(nuke_off_station == NUKE_SYNDICATE_BASE) + return NUKE_RESULT_FLUKE + else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) + return NUKE_RESULT_NUKE_WIN + else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) + return NUKE_RESULT_NOSURVIVORS + else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) + return NUKE_RESULT_WRONG_STATION + else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) + return NUKE_RESULT_WRONG_STATION_DEAD + else if ((disk_rescued || evacuation) && operatives_dead()) + return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD + else if (disk_rescued) + return NUKE_RESULT_CREW_WIN + else if (!disk_rescued && operatives_dead()) + return NUKE_RESULT_DISK_LOST + else if (!disk_rescued && evacuation) + return NUKE_RESULT_DISK_STOLEN + else + return //Undefined result + +/datum/objective_team/nuclear/roundend_report() + var/list/parts = list() + parts += "[syndicate_name] Operatives:" + + switch(get_result()) + if(NUKE_RESULT_FLUKE) + parts += "Humiliating Syndicate Defeat" + parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!" + if(NUKE_RESULT_NUKE_WIN) + parts += "Syndicate Major Victory!" + parts += "[syndicate_name] operatives have destroyed [station_name()]!" + if(NUKE_RESULT_NOSURVIVORS) + parts += "Total Annihilation" + parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" + if(NUKE_RESULT_WRONG_STATION) + parts += "Crew Minor Victory" + parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!" + if(NUKE_RESULT_WRONG_STATION_DEAD) + parts += "[syndicate_name] operatives have earned Darwin Award!" + parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!" + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + parts += "Crew Major Victory!" + parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives" + if(NUKE_RESULT_CREW_WIN) + parts += "Crew Major Victory" + parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!" + if(NUKE_RESULT_DISK_LOST) + parts += "Neutral Victory!" + parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!" + if(NUKE_RESULT_DISK_STOLEN) + parts += "Syndicate Minor Victory!" + parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!" + else + parts += "Neutral Victory" + parts += "Mission aborted!" + + var/text = "
The syndicate operatives were:" + var/purchases = "" + var/TC_uses = 0 + for(var/I in members) + var/datum/mind/syndicate = I + for(var/U in GLOB.uplinks) + var/datum/component/uplink/H = U + if(H.owner == syndicate.key) + TC_uses += H.spent_telecrystals + if(H.purchase_log) + purchases += H.purchase_log.generate_render(show_key = FALSE) + else + stack_trace("WARNING: Nuke Op uplink with no purchase_log Owner: [H.owner]") + text += printplayerlist(members) + text += "
" + text += "(Syndicates used [TC_uses] TC) [purchases]" + if(TC_uses == 0 && SSticker.mode.station_was_nuked && !operatives_dead()) + text += "[icon2html('icons/badass.dmi', world, "badass")]" + + parts += text + + return "
[parts.Join("
")]
" diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm index ad32e09151..e0ce38c1e4 100644 --- a/code/datums/antagonists/pirate.dm +++ b/code/datums/antagonists/pirate.dm @@ -1,6 +1,7 @@ /datum/antagonist/pirate name = "Space Pirate" job_rank = ROLE_TRAITOR + roundend_category = "space pirates" var/datum/objective_team/pirate/crew /datum/antagonist/pirate/greet() @@ -36,7 +37,6 @@ /datum/objective_team/pirate name = "Pirate crew" - var/list/objectives = list() /datum/objective_team/pirate/proc/forge_objectives() var/datum/objective/loot/getbooty = new() @@ -84,11 +84,11 @@ GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( loot_table[lootname] = count else loot_table[lootname] += count - var/text = "" + var/list/loot_texts = list() for(var/key in loot_table) var/amount = loot_table[key] - text += "[amount] [key][amount > 1 ? "s":""], " - return text + loot_texts += "[amount] [key][amount > 1 ? "s":""]" + return loot_texts.Join(", ") /datum/objective/loot/proc/get_loot_value() if(!storage_area) @@ -105,31 +105,26 @@ GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( return ..() || get_loot_value() >= target_value -//These need removal ASAP as everything is converted to datum antags. -/datum/game_mode/proc/auto_declare_completion_pirates() - var/list/datum/mind/pirates = get_antagonists(/datum/antagonist/pirate) - var/datum/objective_team/pirate/crew - var/text = "" - if(pirates.len) - text += "
Space Pirates were:" - for(var/datum/mind/M in pirates) - text += printplayer(M) - if(!crew) - var/datum/antagonist/pirate/P = M.has_antag_datum(/datum/antagonist/pirate) - crew = P.crew - if(crew) - text += "
Loot stolen: " - var/datum/objective/loot/L = locate() in crew.objectives - text += L.loot_listing() - text += "
Total loot value : [L.get_loot_value()]/[L.target_value] credits" - var/all_dead = TRUE - for(var/datum/mind/M in crew.members) - if(considered_alive(M)) - all_dead = FALSE - break - if(L.check_completion() && !all_dead) - text += "
The pirate crew was successful!" - else - text += "
The pirate crew has failed." - to_chat(world, text) \ No newline at end of file +/datum/objective_team/pirate/roundend_report() + var/list/parts = list() + + parts += "Space Pirates were:" + + var/all_dead = TRUE + for(var/datum/mind/M in members) + if(considered_alive(M)) + all_dead = FALSE + parts += printplayerlist(members) + + parts += "Loot stolen: " + var/datum/objective/loot/L = locate() in objectives + parts += L.loot_listing() + parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits" + + if(L.check_completion() && !all_dead) + parts += "The pirate crew was successful!" + else + parts += "The pirate crew has failed." + + return parts.Join("
") \ No newline at end of file diff --git a/code/datums/antagonists/revolution.dm b/code/datums/antagonists/revolution.dm index 9db86bdf08..14c6d1ab0e 100644 --- a/code/datums/antagonists/revolution.dm +++ b/code/datums/antagonists/revolution.dm @@ -3,6 +3,7 @@ /datum/antagonist/rev name = "Revolutionary" + roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen job_rank = ROLE_REV var/hud_type = "rev" var/datum/objective_team/revolution/rev_team @@ -184,7 +185,6 @@ /datum/objective_team/revolution name = "Revolution" - var/list/objectives = list() var/max_headrevs = 3 /datum/objective_team/revolution/proc/update_objectives(initial = FALSE) @@ -227,3 +227,56 @@ rev.promote() addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) + + +/datum/objective_team/revolution/roundend_report() + if(!members.len) + return + + var/list/result = list() + + result += "
" + + var/num_revs = 0 + var/num_survivors = 0 + for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) + if(survivor.ckey) + num_survivors++ + if(survivor.mind) + if(is_revolutionary(survivor)) + num_revs++ + if(num_survivors) + result += "Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%
" + + + var/list/targets = list() + var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head) + var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE) + if(headrevs.len) + var/list/headrev_part = list() + headrev_part += "The head revolutionaries were:" + headrev_part += printplayerlist(headrevs,TRUE) + result += headrev_part.Join("
") + + if(revs.len) + var/list/rev_part = list() + rev_part += "The revolutionaries were:" + rev_part += printplayerlist(revs,TRUE) + result += rev_part.Join("
") + + var/list/heads = SSjob.get_all_heads() + if(heads.len) + var/head_text = "The heads of staff were:" + head_text += "
    " + for(var/datum/mind/head in heads) + var/target = (head in targets) + head_text += "
  • " + if(target) + head_text += "Target" + head_text += "[printplayer(head, 1)]
  • " + head_text += "

" + result += head_text + + result += "
" + + return result.Join() \ No newline at end of file diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm index e1e6dc09c8..7f23215d6c 100644 --- a/code/datums/antagonists/wizard.dm +++ b/code/datums/antagonists/wizard.dm @@ -5,13 +5,13 @@ /datum/antagonist/wizard name = "Space Wizard" + roundend_category = "wizards/witches" job_rank = ROLE_WIZARD var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE var/hud_version = "wizard" var/datum/objective_team/wizard/wiz_team //Only created if wizard summons apprentices - var/list/objectives = list() //this should be base datum antag proc and list, todo make lazy var/move_to_lair = TRUE var/outfit_type = /datum/outfit/wizard var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ @@ -45,10 +45,12 @@ /datum/objective_team/wizard name = "wizard team" + var/datum/antagonist/wizard/master_wizard /datum/antagonist/wizard/proc/create_wiz_team() wiz_team = new(owner) wiz_team.name = "[owner.current.real_name] team" + wiz_team.master_wizard = src update_wiz_icons_added(owner.current) /datum/antagonist/wizard/proc/send_to_lair() @@ -283,4 +285,46 @@ var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") new_objective.owner = owner owner.objectives += new_objective - objectives += new_objective \ No newline at end of file + objectives += new_objective + +//Solo wizard report +/datum/antagonist/wizard/roundend_report() + var/list/parts = list() + + parts += printplayer(owner) + + var/count = 1 + var/wizardwin = 1 + for(var/datum/objective/objective in objectives) + if(objective.check_completion()) + parts += "Objective #[count]: [objective.explanation_text] Success!" + else + parts += "Objective #[count]: [objective.explanation_text] Fail." + wizardwin = 0 + count++ + + if(wizardwin) + parts += "The wizard was successful!" + else + parts += "The wizard has failed!" + + if(owner.spell_list.len>0) + parts += "[owner.name] used the following spells: " + var/list/spell_names = list() + for(var/obj/effect/proc_holder/spell/S in owner.spell_list) + spell_names += S.name + parts += spell_names.Join(", ") + + return parts.Join("
") + +//Wizard with apprentices report +/datum/objective_team/wizard/roundend_report() + var/list/parts = list() + + parts += "Wizards/witches of [master_wizard.owner.name] team were:" + parts += master_wizard.roundend_report() + parts += " " + parts += "[master_wizard.owner.name] apprentices were:" + parts += printplayerlist(members - master_wizard.owner) + + return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c0ab1dc015..14d619c917 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -185,12 +185,6 @@ objectives, uplinks, powers etc are all handled. */ -/datum/mind/proc/remove_objectives() - if(objectives.len) - for(var/datum/objective/O in objectives) - objectives -= O - qdel(O) - /datum/mind/proc/remove_changeling() var/datum/antagonist/changeling/C = has_antag_datum(/datum/antagonist/changeling) if(C) @@ -223,7 +217,6 @@ if(src in SSticker.mode.cult) SSticker.mode.remove_cultist(src, 0, 0) special_role = null - remove_objectives() remove_antag_equip() /datum/mind/proc/remove_rev() @@ -769,17 +762,44 @@ var/objective_pos var/def_value + + + var/datum/antagonist/target_antag + if (href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) if (!objective) return - objective_pos = objectives.Find(objective) + + for(var/datum/antagonist/A in antag_datums) + if(objective in A.objectives) + target_antag = A + objective_pos = A.objectives.Find(objective) + break + + if(!target_antag) //Shouldn't happen + stack_trace("objective without antagonist found") + objective_pos = objectives.Find(objective) //Text strings are easy to manipulate. Revised for simplicity. var/temp_obj_type = "[objective.type]"//Convert path into a text string. def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. if(!def_value)//If it's a custom objective, it will be an empty string. def_value = "custom" + else + switch(antag_datums.len) + if(0) + target_antag = add_antag_datum(/datum/antagonist/custom) + if(1) + target_antag = antag_datums[1] + else + var/datum/antagonist/target = input("Which antagonist gets the objective:", "Antagonist", def_value) as null|anything in antag_datums + "(new custom antag)" + if (QDELETED(target)) + return + else if(target == "(new custom antag)") + target_antag = add_antag_datum(/datum/antagonist/custom) + else + target_antag = target var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "late-assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom") if (!new_obj_type) @@ -901,11 +921,15 @@ return if (objective) + if(target_antag) + target_antag.objectives -= objective objectives -= objective - objectives.Insert(objective_pos, new_objective) + target_antag.objectives.Insert(objective_pos, new_objective) message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") else + if(target_antag) + target_antag.objectives += new_objective objectives += new_objective message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") @@ -914,6 +938,11 @@ var/datum/objective/objective = locate(href_list["obj_delete"]) if(!istype(objective)) return + + for(var/datum/antagonist/A in antag_datums) + if(objective in A.objectives) + A.objectives -= objective + break objectives -= objective message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") @@ -996,11 +1025,13 @@ message_admins("[key_name_admin(usr)] has cult'ed [current].") log_admin("[key_name(usr)] has cult'ed [current].") if("tome") - if (!SSticker.mode.equip_cultist(current,1)) + var/datum/antagonist/cult/C = has_antag_datum(/datum/antagonist/cult,TRUE) + if (C.equip_cultist(current,1)) to_chat(usr, "Spawning tome failed!") if("amulet") - if (!SSticker.mode.equip_cultist(current)) + var/datum/antagonist/cult/C = has_antag_datum(/datum/antagonist/cult,TRUE) + if (C.equip_cultist(current)) to_chat(usr, "Spawning amulet failed!") else if(href_list["clockcult"]) @@ -1407,16 +1438,11 @@ /datum/mind/proc/make_Cultist() - if(!(src in SSticker.mode.cult)) - SSticker.mode.add_cultist(src,FALSE) + if(!has_antag_datum(/datum/antagonist/cult,TRUE)) + SSticker.mode.add_cultist(src,FALSE,equip=TRUE) special_role = "Cultist" to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy your world is, you see that it should be open to the knowledge of Nar-Sie.") to_chat(current, "Assist your new bretheren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - var/datum/antagonist/cult/C - C.cult_memorization(src) - var/mob/living/carbon/human/H = current - if (!SSticker.mode.equip_cultist(current)) - to_chat(H, "Spawning an amulet from your Master failed.") /datum/mind/proc/make_Rev() var/datum/antagonist/rev/head/head = new(src) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 7456b8f5eb..d0ab4347ff 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -242,6 +242,7 @@ new_objective2.owner = S.mind new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]." S.mind.objectives += new_objective2 + S.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. \ Ctrl+Click a blood pool to manifest.") diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index c1af1601ce..34373da5c8 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -1,41 +1,3 @@ -/datum/objective_team/brother_team - name = "brotherhood" - member_name = "blood brother" - var/list/objectives = list() - var/meeting_area - -/datum/objective_team/brother_team/is_solo() - return FALSE - -/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) - O.team = src - if(needs_target) - O.find_target() - O.update_explanation_text() - objectives += O - -/datum/objective_team/brother_team/proc/forge_brother_objectives() - objectives = list() - var/is_hijacker = prob(10) - for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) - forge_single_objective() - if(is_hijacker) - if(!locate(/datum/objective/hijack) in objectives) - add_objective(new/datum/objective/hijack) - else if(!locate(/datum/objective/escape) in objectives) - add_objective(new/datum/objective/escape) - -/datum/objective_team/brother_team/proc/forge_single_objective() - if(prob(50)) - if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) - add_objective(new/datum/objective/destroy, TRUE) - else if(prob(30)) - add_objective(new/datum/objective/maroon, TRUE) - else - add_objective(new/datum/objective/assassinate, TRUE) - else - add_objective(new/datum/objective/steal, TRUE) - /datum/game_mode var/list/datum/mind/brothers = list() var/list/datum/objective_team/brother_team/brother_teams = list() @@ -54,6 +16,7 @@ var/list/datum/objective_team/brother_team/pre_brother_teams = list() var/const/team_amount = 2 //hard limit on brother teams if scaling is turned off var/const/min_team_size = 2 + traitors_required = FALSE //Only teams are possible var/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library") @@ -92,12 +55,14 @@ team.forge_brother_objectives() for(var/datum/mind/M in team.members) M.add_antag_datum(ANTAG_DATUM_BROTHER, team) + team.update_name() brother_teams += pre_brother_teams return ..() /datum/game_mode/traitor/bros/generate_report() return "It's Syndicate recruiting season. Be alert for potential Syndicate infiltrators, but also watch out for disgruntled employees trying to defect. Unlike Nanotrasen, the Syndicate prides itself in teamwork and will only recruit pairs that share a brotherly trust." +<<<<<<< HEAD /datum/game_mode/proc/auto_declare_completion_brother() if(!LAZYLEN(brother_teams)) return @@ -130,6 +95,8 @@ text += "
" to_chat(world, text) +======= +>>>>>>> 3d81385... Roundend report refactor (#33246) /datum/game_mode/proc/update_brother_icons_added(datum/mind/brother_mind) var/datum/atom_hud/antag/brotherhud = GLOB.huds[ANTAG_HUD_BROTHER] brotherhud.join_hud(brother_mind.current) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index a70f392d4f..6fc06f7bca 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -94,6 +94,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th of the Thing being sent to a station in this sector is highly likely. It may be in the guise of any crew member. Trust nobody - suspect everybody. Do not announce this to the crew, \ as paranoia may spread and inhibit workplace efficiency." +<<<<<<< HEAD /datum/game_mode/proc/auto_declare_completion_changeling() var/list/changelings = get_antagonists(/datum/antagonist/changeling,TRUE) //Only real lings get a mention if(changelings.len) @@ -135,6 +136,8 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th return 1 +======= +>>>>>>> 3d81385... Roundend report refactor (#33246) /proc/changeling_transform(mob/living/carbon/human/user, datum/changelingprofile/chosen_prof) var/datum/dna/chosen_dna = chosen_prof.dna user.real_name = chosen_prof.name diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 61bd9bb496..778cf41022 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -65,13 +65,16 @@ Credit where due: return TRUE return FALSE -/proc/add_servant_of_ratvar(mob/L, silent = FALSE) +/proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE) if(!L || !L.mind) return var/update_type = ANTAG_DATUM_CLOCKCULT if(silent) update_type = ANTAG_DATUM_CLOCKCULT_SILENT - . = L.mind.add_antag_datum(update_type) + var/datum/antagonist/clockcult/C = new update_type(L.mind) + C.make_team = create_team + C.show_in_roundend = create_team //tutorial scarabs begone + . = L.mind.add_antag_datum(C) /proc/remove_servant_of_ratvar(mob/L, silent = FALSE) if(!L || !L.mind) @@ -88,7 +91,6 @@ Credit where due: /////////////// /datum/game_mode - var/datum/mind/eminence //The clockwork Eminence var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar var/clockwork_explanation = "Defend the Ark of the Clockwork Justiciar and free Ratvar." //The description of the current objective @@ -110,6 +112,8 @@ Credit where due: var/servants_to_serve = list() var/roundstart_player_count var/ark_time //In minutes, how long the Ark waits before activation; this is equal to 30 + (number of players / 5) (max 40 mins.) + + var/datum/objective_team/clockcult/main_clockcult /datum/game_mode/clockwork_cult/pre_setup() if(CONFIG_GET(flag/protect_roles_from_antagonist)) @@ -191,16 +195,16 @@ Credit where due: . = ..() /datum/game_mode/clockwork_cult/proc/check_clockwork_victory() + return main_clockcult.check_clockwork_victory() + +/datum/game_mode/clock_cult/set_round_result() + ..() if(GLOB.clockwork_gateway_activated) SSticker.news_report = CLOCK_SUMMON - return TRUE + SSticker.mode_result = "win - servants completed their objective (summon ratvar)" else SSticker.news_report = CULT_FAILURE - return FALSE - -/datum/game_mode/clockwork_cult/declare_completion() - ..() - return //Doesn't end until the round does + SSticker.mode_result = "loss - servants failed their objective (summon ratvar)" /datum/game_mode/clockwork_cult/generate_report() return "Bluespace monitors near your sector have detected a continuous stream of patterned fluctuations since the station was completed. It is most probable that a powerful entity \ @@ -210,30 +214,6 @@ Credit where due: working for this entity and utilizing highly-advanced technology to cross the great distance at will. If they should turn out to be a credible threat, the task falls on you and \ your crew to dispatch it in a timely manner." -/datum/game_mode/proc/auto_declare_completion_clockwork_cult() - var/text = "" - if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky? - var/datum/game_mode/clockwork_cult/C = SSticker.mode - if(C.check_clockwork_victory()) - text += "Ratvar's servants defended the Ark until its activation!" - SSticker.mode_result = "win - servants completed their objective (summon ratvar)" - else - text += "The Ark was destroyed! Ratvar will rust away for all eternity!" - SSticker.mode_result = "loss - servants failed their objective (summon ratvar)" - text += "
The servants' objective was: [CLOCKCULT_OBJECTIVE]." - text += "
Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches." - text += "
Construction Value(CV) was: [GLOB.clockwork_construction_value]" - for(var/i in SSticker.scripture_states) - if(i != SCRIPTURE_DRIVER) - text += "
[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" - if(SSticker.mode.eminence) - text += "
The Eminence was: [printplayer(SSticker.mode.eminence)]" - if(servants_of_ratvar.len) - text += "
Ratvar's servants were:" - for(var/datum/mind/M in servants_of_ratvar - SSticker.mode.eminence) - text += printplayer(M) - to_chat(world, text) - /datum/game_mode/proc/update_servant_icons_added(datum/mind/M) var/datum/atom_hud/antag/A = GLOB.huds[ANTAG_HUD_CLOCKWORK] A.join_hud(M.current) diff --git a/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm b/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm index acf6e43974..1b2b867aa5 100644 --- a/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm +++ b/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm @@ -91,7 +91,8 @@ /obj/item/clockwork/construct_chassis/cogscarab/pre_spawn() if(infinite_resources) - construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar //During rounds where they can't interact with the station, let them experiment with builds + //During rounds where they can't interact with the station, let them experiment with builds + construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar /obj/item/clockwork/construct_chassis/cogscarab/post_spawn(mob/living/construct) if(infinite_resources) //Allow them to build stuff and recite scripture diff --git a/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm b/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm index cc91feeb98..8416e4651d 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm @@ -14,16 +14,6 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/static/superheated_walls = 0 -/mob/camera/eminence/Initialize() - if(SSticker.mode.eminence) - return INITIALIZE_HINT_QDEL - . = ..() - -/mob/camera/eminence/Destroy(force) - if(!force && mind && SSticker.mode.eminence == mind) - return QDEL_HINT_LETMELIVE - return ..() - /mob/camera/eminence/CanPass(atom/movable/mover, turf/target) return TRUE @@ -39,12 +29,20 @@ /mob/camera/eminence/Login() ..() - add_servant_of_ratvar(src, TRUE) + var/datum/antagonist/clockcult/C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE) + if(!C) + add_servant_of_ratvar(src, TRUE) + C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE) + if(C && C.clock_team) + if(C.clock_team.eminence) + remove_servant_of_ratvar(src,TRUE) + qdel(src) + else + C.clock_team.eminence = src to_chat(src, "You have been selected as the Eminence!") to_chat(src, "As the Eminence, you lead the servants. Anything you say will be heard by the entire cult.") to_chat(src, "Though you can move through walls, you're also incorporeal, and largely can't interact with the world except for a few ways.") to_chat(src, "Additionally, unless the herald's beacon is activated, you can't understand any speech while away from Reebe.") - SSticker.mode.eminence = mind eminence_help() for(var/V in actions) var/datum/action/A = V diff --git a/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm b/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm index 8d4e936658..495bfaeaa8 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm @@ -17,7 +17,11 @@ return if(kingmaking) return - if(SSticker.mode.eminence) + + var/datum/antagonist/clockcult/C = user.mind.has_antag_datum(/datum/antagonist/clockcult) + if(!C || !C.clock_team) + return + if(C.clock_team.eminence) to_chat(user, "There's already an Eminence!") return if(!GLOB.servants_active) @@ -34,7 +38,9 @@ /obj/structure/destructible/clockwork/eminence_spire/attack_ghost(mob/user) if(!IsAdminGhost(user)) return - if(SSticker.mode.eminence) + + var/datum/antagonist/clockcult/random_cultist = locate() in GLOB.antagonists //if theres no cultists new team without eminence will be created anyway. + if(random_cultist && random_cultist.clock_team && random_cultist.clock_team.eminence) to_chat(user, "There's already an Eminence - too late!") return if(!GLOB.servants_active) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index f20dd25802..67e2225772 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -2,24 +2,23 @@ /datum/game_mode var/list/datum/mind/cult = list() - var/list/cult_objectives = list() - var/eldergod = 1 //for the summon god objective /proc/iscultist(mob/living/M) return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CULT) -/proc/is_sacrifice_target(datum/mind/mind) - if(mind == GLOB.sac_mind) - return TRUE +/datum/objective_team/cult/proc/is_sacrifice_target(datum/mind/mind) + for(var/datum/objective/sacrifice/sac_objective in objectives) + if(mind == sac_objective.target) + return TRUE return FALSE - -/proc/is_convertable_to_cult(mob/living/M) + +/proc/is_convertable_to_cult(mob/living/M,datum/objective_team/cult/specific_cult) if(!istype(M)) return FALSE if(M.mind) if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain"))) return FALSE - if(is_sacrifice_target(M.mind)) + if(specific_cult && specific_cult.is_sacrifice_target(M.mind)) return FALSE if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to)) return FALSE @@ -55,10 +54,10 @@ var/list/cultists_to_cult = list() //the cultists we'll convert + var/datum/objective_team/cult/main_cult + /datum/game_mode/cult/pre_setup() - cult_objectives += "sacrifice" - if(CONFIG_GET(flag/protect_roles_from_antagonist)) restricted_jobs += protected_jobs @@ -86,82 +85,19 @@ /datum/game_mode/cult/post_setup() - if("sacrifice" in cult_objectives) - var/list/possible_targets = get_unconvertables() - if(!possible_targets.len) - message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !(player.mind in cultists_to_cult)) - possible_targets += player.mind - if(possible_targets.len > 0) - GLOB.sac_mind = pick(possible_targets) - if(!GLOB.sac_mind) - message_admins("Cult Sacrifice: ERROR - Null target chosen!") - else - var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role) - var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) - reshape.Shift(SOUTH, 4) - reshape.Shift(EAST, 1) - reshape.Crop(7,4,26,31) - reshape.Crop(-5,-3,26,30) - GLOB.sac_image = reshape - else - message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") - if(!GLOB.summon_spots.len) - while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES) - var/area/summon = pick(GLOB.sortedAreas - GLOB.summon_spots) - if((summon.z in GLOB.station_z_levels) && summon.valid_territory) - GLOB.summon_spots += summon - cult_objectives += "eldergod" - for(var/datum/mind/cult_mind in cultists_to_cult) - equip_cultist(cult_mind.current) - update_cult_icons_added(cult_mind) - to_chat(cult_mind.current, "You are a member of the cult!") - cult_mind.current.playsound_local(get_turf(cult_mind.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change - add_cultist(cult_mind, 0) + add_cultist(cult_mind, 0, equip=TRUE) ..() -/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob,tome = 0) - if(!istype(mob)) - return - if (mob.mind) - if (mob.mind.assigned_role == "Clown") - to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - mob.dna.remove_mutation(CLOWNMUT) - if(tome) - . += cult_give_item(/obj/item/tome, mob) - else - . += cult_give_item(/obj/item/paper/talisman/supply, mob) - to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") - -/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) - var/list/slots = list( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/T = new item_path(mob) - var/item_name = initial(item_path.name) - var/where = mob.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") - return 0 - else - to_chat(mob, "You have a [item_name] in your [where].") - if(where == "backpack") - var/obj/item/storage/B = mob.back - B.orient2hud(mob) - B.show_to(mob) - return 1 - -/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE +/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun , equip = FALSE) //BASE if (!istype(cult_mind)) return 0 - if(cult_mind.add_antag_datum(ANTAG_DATUM_CULT)) + + var/datum/antagonist/cult/new_cultist = new(cult_mind) + new_cultist.give_equipment = equip + + if(cult_mind.add_antag_datum(new_cultist)) if(stun) cult_mind.current.Unconscious(100) return 1 @@ -187,25 +123,19 @@ culthud.leave_hud(cult_mind.current) set_antag_hud(cult_mind.current, null) -/datum/game_mode/cult/proc/get_unconvertables() - var/list/ucs = list() - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !is_convertable_to_cult(player) && !(player.mind in cultists_to_cult)) - ucs += player.mind - return ucs - /datum/game_mode/cult/proc/check_cult_victory() - var/cult_fail = 0 - if(cult_objectives.Find("survive")) - cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise - if(cult_objectives.Find("eldergod")) - cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once - if(cult_objectives.Find("sacrifice")) - if(GLOB.sac_mind && !GLOB.sac_complete) //if the target has been GLOB.sacrificed, ignore this step. otherwise, add 1 to cult_fail - cult_fail++ - return cult_fail //if any objectives aren't met, failure + return main_cult.check_cult_victory() +/datum/game_mode/cult/set_round_result() + ..() + if(check_cult_victory()) + SSticker.mode_result = "win - cult win" + SSticker.news_report = CULT_SUMMON + else + SSticker.mode_result = "loss - staff stopped the cult" + SSticker.news_report = CULT_FAILURE + /datum/game_mode/cult/proc/check_survive() var/acolytes_survived = 0 for(var/datum/mind/cult_mind in cult) @@ -218,57 +148,6 @@ return 1 -/datum/game_mode/cult/declare_completion() - - if(!check_cult_victory()) - SSticker.mode_result = "win - cult win" - to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") - else - SSticker.mode_result = "loss - staff stopped the cult" - to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") - - var/text = "" - - if(cult_objectives.len) - text += "
The cultists' objectives were:" - for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++) - var/explanation - switch(cult_objectives[obj_count]) - if("survive") - if(!check_survive()) - explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!" - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_survive", "SUCCESS")) - SSticker.news_report = CULT_ESCAPE - else - explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail." - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_survive", "FAIL")) - SSticker.news_report = CULT_FAILURE - if("sacrifice") - if(GLOB.sac_complete) - explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Success!" - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "SUCCESS")) - else - explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Fail." - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "FAIL")) - if("eldergod") - if(!eldergod) - explanation = "Summon Nar-Sie. The summoning can only be accomplished in [english_list(GLOB.summon_spots)].Success!" - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "SUCCESS")) - SSticker.news_report = CULT_SUMMON - else - explanation = "Summon Nar-Sie. The summoning can only be accomplished in [english_list(GLOB.summon_spots)]Fail." - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "FAIL")) - SSticker.news_report = CULT_FAILURE - - text += "
Objective #[obj_count]: [explanation]" - if(cult.len) - text += "
The cultists were:" - for(var/datum/mind/M in cult) - text += printplayer(M) - to_chat(world, text) - ..() - return 1 - /datum/game_mode/cult/generate_report() return "Some stations in your sector have reported evidence of blood sacrifice and strange magic. Ties to the Wizards' Federation have been proven not to exist, and many employees \ have disappeared; even Central Command employees light-years away have felt strange presences and at times hysterical compulsions. Interrogations point towards this being the work of \ @@ -276,41 +155,4 @@ devoted to stopping this cult. Note that holy water seems to weaken and eventually return the minds of cultists that ingest it, and mindshield implants will prevent conversion \ altogether." -/datum/game_mode/proc/datum_cult_completion() - var/text = "" - var/cult_fail = 0 - cult_fail += eldergod - if(!GLOB.sac_complete) - cult_fail++ - if(!cult_fail) - SSticker.mode_result = "win - cult win" - to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") - else - SSticker.mode_result = "loss - staff stopped the cult" - to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") - if(cult_objectives.len) - text += "
The cultists' objectives were:" - for(var/obj_count in 1 to 2) - var/explanation - switch(cult_objectives[obj_count]) - if("sacrifice") - if(GLOB.sac_mind) - if(GLOB.sac_complete) - explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Success!" - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "SUCCESS")) - else - explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Fail." - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "FAIL")) - if("eldergod") - if(!eldergod) - explanation = "Summon Nar-Sie. Success!" - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "SUCCESS")) - SSticker.news_report = CULT_SUMMON - else - explanation = "Summon Nar-Sie. Fail." - SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "FAIL")) - SSticker.news_report = CULT_FAILURE - text += "
Objective #[obj_count]: [explanation]" - to_chat(world, text) - #undef CULT_SCALING_COEFFICIENT diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 530b6ebb20..2938f5abf4 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -88,19 +88,21 @@ button_icon_state = "cultvote" /datum/action/innate/cult/mastervote/IsAvailable() - if(GLOB.cult_vote_called || !ishuman(owner)) + var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!C || C.cult_team.cult_vote_called || !ishuman(owner)) return FALSE return ..() /datum/action/innate/cult/mastervote/Activate() - pollCultists(owner) + var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + pollCultists(owner,C.cult_team) -/proc/pollCultists(var/mob/living/Nominee) //Cult Master Poll +/proc/pollCultists(var/mob/living/Nominee,datum/objective_team/cult/team) //Cult Master Poll if(world.time < CULT_POLL_WAIT) to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return - GLOB.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try - for(var/datum/mind/B in SSticker.mode.cult) + team.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try + for(var/datum/mind/B in team.members) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) @@ -108,39 +110,39 @@ to_chat(B.current, "Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.") sleep(100) var/list/asked_cultists = list() - for(var/datum/mind/B in SSticker.mode.cult) + for(var/datum/mind/B in team.members) if(B.current && B.current != Nominee && !B.current.incapacitated()) SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg') asked_cultists += B.current var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists) if(QDELETED(Nominee) || Nominee.incapacitated()) - GLOB.cult_vote_called = FALSE - for(var/datum/mind/B in SSticker.mode.cult) + team.cult_vote_called = FALSE + for(var/datum/mind/B in team.members) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) to_chat(B.current,"[Nominee] has died in the process of attempting to win the cult's support!") return FALSE if(!Nominee.mind) - GLOB.cult_vote_called = FALSE - for(var/datum/mind/B in SSticker.mode.cult) + team.cult_vote_called = FALSE + for(var/datum/mind/B in team.members) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) to_chat(B.current,"[Nominee] has gone catatonic in the process of attempting to win the cult's support!") return FALSE if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5) - GLOB.cult_vote_called = FALSE - for(var/datum/mind/B in SSticker.mode.cult) + team.cult_vote_called = FALSE + for(var/datum/mind/B in team.members) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) to_chat(B.current, "[Nominee] could not win the cult's support and shall continue to serve as an acolyte.") return FALSE - GLOB.cult_mastered = TRUE + team.cult_mastered = TRUE SSticker.mode.remove_cultist(Nominee.mind, TRUE) Nominee.mind.add_antag_datum(ANTAG_DATUM_CULT_MASTER) - for(var/datum/mind/B in SSticker.mode.cult) + for(var/datum/mind/B in team.members) if(B.current) for(var/datum/action/innate/cult/mastervote/vote in B.current.actions) vote.Remove(B.current) @@ -159,6 +161,9 @@ button_icon_state = "sintouch" /datum/action/innate/cult/master/finalreck/Activate() + var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!antag) + return for(var/i in 1 to 4) chant(i) var/list/destinations = list() @@ -169,7 +174,7 @@ to_chat(owner, "You need more space to summon the cult!") return if(do_after(owner, 30, target = owner)) - for(var/datum/mind/B in SSticker.mode.cult) + for(var/datum/mind/B in antag.cult_team.members) if(B.current && B.current.stat != DEAD) var/turf/mobloc = get_turf(B.current) switch(i) @@ -194,7 +199,7 @@ addtimer(CALLBACK(B.current, /mob/.proc/reckon, final), 10) else return - GLOB.reckoning_complete = TRUE + antag.cult_team.reckoning_complete = TRUE Remove(owner) /mob/proc/reckon(turf/final) @@ -269,34 +274,37 @@ var/turf/T = get_turf(ranged_ability_user) if(!isturf(T)) return FALSE + + var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(target in view(7, get_turf(ranged_ability_user))) - GLOB.blood_target = target + C.cult_team.blood_target = target var/area/A = get_area(target) attached_action.cooldown = world.time + attached_action.base_cooldown addtimer(CALLBACK(attached_action.owner, /mob.proc/update_action_buttons_icon), attached_action.base_cooldown) - GLOB.blood_target_image = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER) - GLOB.blood_target_image.appearance_flags = RESET_COLOR - GLOB.blood_target_image.pixel_x = -target.pixel_x - GLOB.blood_target_image.pixel_y = -target.pixel_y + C.cult_team.blood_target_image = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER) + C.cult_team.blood_target_image.appearance_flags = RESET_COLOR + C.cult_team.blood_target_image.pixel_x = -target.pixel_x + C.cult_team.blood_target_image.pixel_y = -target.pixel_y for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current.stat != DEAD && B.current.client) - to_chat(B.current, "Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!") + to_chat(B.current, "Master [ranged_ability_user] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!") SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) - B.current.client.images += GLOB.blood_target_image + B.current.client.images += C.cult_team.blood_target_image attached_action.owner.update_action_buttons_icon() remove_ranged_ability("The marking rite is complete! It will last for 90 seconds.") - GLOB.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target), 900, TIMER_STOPPABLE) + C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target,C.cult_team), 900, TIMER_STOPPABLE) return TRUE return FALSE -/proc/reset_blood_target() - for(var/datum/mind/B in SSticker.mode.cult) +/proc/reset_blood_target(datum/objective_team/cult/team) + for(var/datum/mind/B in team.members) if(B.current && B.current.stat != DEAD && B.current.client) - if(GLOB.blood_target) + if(team.blood_target) to_chat(B.current,"The blood mark has expired!") - B.current.client.images -= GLOB.blood_target_image - QDEL_NULL(GLOB.blood_target_image) - GLOB.blood_target = null + B.current.client.images -= team.blood_target_image + QDEL_NULL(team.blood_target_image) + team.blood_target = null diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 2adaa57a2f..f0934b524f 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -179,6 +179,13 @@ This file contains the arcane tome files. var/list/shields = list() var/area/A = get_area(src) + var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!user_antag) + return + + var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives + var/datum/objective/sacrifice/sac_objective = locate() in user_antag.cult_team.objectives + if(!check_rune_turf(Turf, user)) return entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in GLOB.rune_types @@ -196,18 +203,20 @@ This file contains the arcane tome files. A = get_area(src) if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return + + //AAAAAAAAAAAAAAAH, i'm rewriting enough for now so TODO: remove this shit if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) - if(!("eldergod" in SSticker.mode.cult_objectives)) + if(!summon_objective) to_chat(user, "Nar-Sie does not wish to be summoned!") return - if(!GLOB.sac_complete) + if(sac_objective && !sac_objective.check_completion()) to_chat(user, "The sacrifice is not complete. The portal would lack the power to open if you tried!") return - if(!SSticker.mode.eldergod) + if(summon_objective.check_completion()) to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") return - if(!(A in GLOB.summon_spots)) - to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!") + if(!(A in summon_objective.summon_spots)) + to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") return var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie; it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") if(confirm_final == "No") @@ -215,8 +224,8 @@ This file contains the arcane tome files. return Turf = get_turf(user) A = get_area(src) - if(!(A in GLOB.summon_spots)) // Check again to make sure they didn't move - to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!") + if(!(A in summon_objective.summon_spots)) // Check again to make sure they didn't move + to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") return priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/ai/spanomalies.ogg') for(var/B in spiral_range_turfs(1, user, 1)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index be1c2ccaff..1bab1d90f4 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -349,7 +349,11 @@ structure_check() searches for nearby cultist structures required for the invoca color = RUNE_COLOR_DARKRED var/mob/living/L = pick(myriad_targets) var/is_clock = is_servant_of_ratvar(L) - var/is_convertable = is_convertable_to_cult(L) + + var/mob/living/F = invokers[1] + var/datum/antagonist/cult/C = F.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + + var/is_convertable = is_convertable_to_cult(L,C.cult_team) if(L.stat != DEAD && (is_clock || is_convertable)) invocation = "Mah'weyh pleggh at e'ntrath!" ..() @@ -397,17 +401,27 @@ structure_check() searches for nearby cultist structures required for the invoca return 1 /obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) + var/mob/living/first_invoker = invokers[1] + if(!first_invoker) + return FALSE + var/datum/antagonist/cult/C = first_invoker.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(!C) + return + + var/big_sac = FALSE - if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) + if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) for(var/M in invokers) to_chat(M, "[sacrificial] is too greatly linked to the world! You need three acolytes!") log_game("Offer rune failed - not enough acolytes and target is living or sac target") return FALSE if(sacrificial.mind) GLOB.sacrificed += sacrificial.mind - if(is_sacrifice_target(sacrificial.mind)) - GLOB.sac_complete = TRUE - big_sac = TRUE + for(var/datum/objective/sacrifice/sac_objective in C.cult_team.objectives) + if(sac_objective.target == sacrificial.mind) + sac_objective.sacced = TRUE + sac_objective.update_explanation_text() + big_sac = TRUE else GLOB.sacrificed += sacrificial @@ -481,7 +495,6 @@ structure_check() searches for nearby cultist structures required for the invoca sleep(40) if(src) color = RUNE_COLOR_RED - SSticker.mode.eldergod = FALSE new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed /obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm index 957e261933..44f3368feb 100644 --- a/code/game/gamemodes/devil/game_mode.dm +++ b/code/game/gamemodes/devil/game_mode.dm @@ -3,32 +3,6 @@ var/list/datum/mind/devils = list() var/devil_ascended = 0 // Number of arch devils on station -/datum/game_mode/proc/auto_declare_completion_sintouched() - var/text = "" - if(sintouched.len) - text += "
The sintouched were:" - var/list/sintouchedUnique = uniqueList(sintouched) - for(var/S in sintouchedUnique) - var/datum/mind/sintouched_mind = S - text += printplayer(sintouched_mind) - text += printobjectives(sintouched_mind) - text += "
" - text += "
" - to_chat(world, text) - -/datum/game_mode/proc/auto_declare_completion_devils() - /var/text = "" - if(devils.len) - text += "
The devils were:" - for(var/D in devils) - var/datum/mind/devil = D - text += printplayer(devil) - text += printdevilinfo(devil.current) - text += printobjectives(devil) - text += "
" - text += "
" - to_chat(world, text) - /datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity) var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target) for(var/i = 1 to quantity) @@ -41,18 +15,6 @@ else objective.find_target() -/datum/game_mode/proc/printdevilinfo(mob/living/ply) - var/datum/antagonist/devil/devilinfo = is_devil(ply) - if(!devilinfo) - return "Target is not a devil." - var/text = "
The devil's true name is: [devilinfo.truename]
" - text += "The devil's bans were:
" - text += " [GLOB.lawlorify[LORE][devilinfo.ban]]
" - text += " [GLOB.lawlorify[LORE][devilinfo.bane]]
" - text += " [GLOB.lawlorify[LORE][devilinfo.obligation]]
" - text += " [GLOB.lawlorify[LORE][devilinfo.banish]]

" - return text - /datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind) var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL] hud.join_hud(devil_mind.current) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 803e73b9e0..0c6a8fd1e0 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -73,7 +73,6 @@ /datum/game_mode/proc/pre_setup() return 1 - ///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. if(!report) @@ -241,55 +240,9 @@ return 0 -/datum/game_mode/proc/declare_completion() - var/clients = 0 - var/surviving_humans = 0 - var/surviving_total = 0 - var/ghosts = 0 - var/escaped_humans = 0 - var/escaped_total = 0 - - for(var/mob/M in GLOB.player_list) - if(M.client) - clients++ - if(ishuman(M)) - if(!M.stat) - surviving_humans++ - if(M.z == ZLEVEL_CENTCOM) - escaped_humans++ - if(!M.stat) - surviving_total++ - if(M.z == ZLEVEL_CENTCOM) - escaped_total++ - - - if(isobserver(M)) - ghosts++ - - if(clients) - SSblackbox.record_feedback("nested tally", "round_end_stats", clients, list("clients")) - if(ghosts) - SSblackbox.record_feedback("nested tally", "round_end_stats", ghosts, list("ghosts")) - if(surviving_humans) - SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_humans, list("survivors", "human")) - if(surviving_total) - SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_total, list("survivors", "total")) - if(escaped_humans) - SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_humans, list("escapees", "human")) - if(escaped_total) - SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_total, list("escapees", "total")) - - send2irc("Server", "Round just ended.") - if(cult.len && !istype(SSticker.mode, /datum/game_mode/cult)) - datum_cult_completion() - - return 0 - - /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 - /datum/game_mode/proc/send_intercept() var/intercepttext = "Central Command Status Summary
" intercepttext += "Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \ @@ -451,34 +404,6 @@ for (var/C in GLOB.admins) to_chat(C, msg) -/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck) - var/text = "
[ply.key] was [ply.name] the [ply.assigned_role] and" - if(ply.current) - if(ply.current.stat == DEAD) - text += " died" - else - text += " survived" - if(fleecheck) - var/turf/T = get_turf(ply.current) - if(!T || !(T.z in GLOB.station_z_levels)) - text += " while fleeing the station" - if(ply.current.real_name != ply.name) - text += " as [ply.current.real_name]" - else - text += " had their body destroyed" - return text - -/datum/game_mode/proc/printobjectives(datum/mind/ply) - var/text = "" - var/count = 1 - for(var/datum/objective/objective in ply.objectives) - if(objective.check_completion()) - text += "
Objective #[count]: [objective.explanation_text] Success!" - else - text += "
Objective #[count]: [objective.explanation_text] Fail." - count++ - return text - //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/game_mode/proc/age_check(client/C) if(get_remaining_days(C) == 0) @@ -518,11 +443,6 @@ station_goals += new picked -/datum/game_mode/proc/declare_station_goal_completion() - for(var/V in station_goals) - var/datum/station_goal/G = V - G.print_result() - /datum/game_mode/proc/generate_report() //Generates a small text blurb for the gamemode in centcom report return "Gamemode report for [name] not set. Contact a coder." @@ -530,3 +450,20 @@ /datum/game_mode/proc/OnNukeExplosion(off_station) if(off_station < 2) station_was_nuked = TRUE //Will end the round on next check. +<<<<<<< HEAD +======= + +//Additional report section in roundend report +/datum/game_mode/proc/special_report() + return + +//Set result and news report here +/datum/game_mode/proc/set_round_result() + SSticker.mode_result = "undefined" + if(station_was_nuked) + SSticker.news_report = STATION_DESTROYED_NUKE + if(EMERGENCY_ESCAPED_OR_ENDGAMED) + SSticker.news_report = STATION_EVACUATED + if(SSshuttle.emergency.is_hijacked()) + SSticker.news_report = SHUTTLE_HIJACK +>>>>>>> 3d81385... Roundend report refactor (#33246) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index b7a6580570..f8e0666015 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -30,30 +30,29 @@ spawn_meteors(ramp_up_final, wavetype) -/datum/game_mode/meteor/declare_completion() - var/text +/datum/game_mode/meteor/special_report() var/survivors = 0 + var/list/survivor_list = list() for(var/mob/living/player in GLOB.player_list) if(player.stat != DEAD) ++survivors if(player.onCentCom()) - text += "
[player.real_name] escaped to the safety of CentCom." + survivor_list += "[player.real_name] escaped to the safety of CentCom." else if(player.onSyndieBase()) - text += "
[player.real_name] escaped to the (relative) safety of Syndicate Space." + survivor_list += "[player.real_name] escaped to the (relative) safety of Syndicate Space." else - text += "
[player.real_name] survived but is stranded without any hope of rescue." - + survivor_list += "[player.real_name] survived but is stranded without any hope of rescue." if(survivors) - to_chat(world, "The following survived the meteor storm:[text]") + return "The following survived the meteor storm:
[survivor_list.Join("
")]" else - to_chat(world, "Nobody survived the meteor storm!") + return "Nobody survived the meteor storm!" - SSticker.mode_result = "end - evacuation" +/datum/game_mode/meteor/set_round_result() ..() - return 1 + SSticker.mode_result = "end - evacuation" /datum/game_mode/meteor/generate_report() return "[pick("Asteroids have", "Meteors have", "Large rocks have", "Stellar minerals have", "Space hail has", "Debris has")] been detected near your station, and a collision is possible, \ diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 4eb8642c02..050cac443d 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -1,19 +1,5 @@ -/datum/objective_team/abductor_team - member_name = "abductor" - var/list/objectives = list() - var/team_number - -/datum/objective_team/abductor_team/is_solo() - return FALSE - -/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) - O.team = src - O.update_explanation_text() - objectives += O - /datum/game_mode var/list/datum/mind/abductors = list() - var/list/datum/mind/abductees = list() /datum/game_mode/abduction name = "abduction" @@ -99,35 +85,6 @@ return ..() return ..() -/datum/game_mode/abduction/declare_completion() - for(var/datum/objective_team/abductor_team/team in abductor_teams) - var/won = TRUE - for(var/datum/objective/O in team.objectives) - if(!O.check_completion()) - won = FALSE - if(won) - to_chat(world, "[team.name] team fulfilled its mission!") - else - to_chat(world, "[team.name] team failed its mission.") - ..() - return TRUE - -/datum/game_mode/proc/auto_declare_completion_abduction() - var/text = "" - if(abductors.len) - text += "
The abductors were:" - for(var/datum/mind/abductor_mind in abductors) - text += printplayer(abductor_mind) - text += printobjectives(abductor_mind) - text += "
" - if(abductees.len) - text += "
The abductees were:" - for(var/datum/mind/abductee_mind in abductees) - text += printplayer(abductee_mind) - text += printobjectives(abductee_mind) - text += "
" - to_chat(world, text) - // LANDMARKS /obj/effect/landmark/abductor var/team_number = 1 diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index c3a591a278..cf1329aec9 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -151,13 +151,18 @@ var/mob/living/mob_occupant = occupant if(mob_occupant.stat != DEAD) if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"]) + flash = Experiment(occupant,href_list["experiment"],usr) updateUsrDialog() add_fingerprint(usr) -/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type) +/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user) LAZYINITLIST(history) var/mob/living/carbon/human/H = occupant + + var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor) + if(!user_abductor) + return "Authorization failure. Contact mothership immidiately." + var/point_reward = 0 if(H in history) return "Specimen already in database." @@ -182,15 +187,8 @@ if(3) to_chat(H, "You feel intensely watched.") sleep(5) - to_chat(H, "Your mind snaps!") - H.gain_trauma_type(BRAIN_TRAUMA_MILD) - to_chat(H, "You can't remember how you got here...") - var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) - var/datum/objective/abductee/O = new objtype() - SSticker.mode.abductees += H.mind - H.mind.objectives += O - H.mind.announce_objectives() - SSticker.mode.update_abductor_icons_added(H.mind) + user_abductor.team.abductees += H.mind + H.mind.add_antag_datum(/datum/antagonist/abductee) for(var/obj/item/organ/heart/gland/G in H.internal_organs) G.Start() diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index 379031dce9..8e02d41441 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -105,13 +105,18 @@ monkey_mind.special_role = null -/datum/game_mode/monkey/declare_completion() +/datum/game_mode/monkey/set_round_result() + ..() if(check_monkey_victory()) SSticker.mode_result = "win - monkey win" - to_chat(world, "The monkeys have overthrown their captors! Eeek eeeek!!") else SSticker.mode_result = "loss - staff stopped the monkeys" - to_chat(world, "The staff managed to contain the monkey infestation!") + +/datum/game_mode/monkey/special_report() + if(check_monkey_victory()) + return "The monkeys have overthrown their captors! Eeek eeeek!!" + else + return "The staff managed to contain the monkey infestation!" /datum/game_mode/monkey/generate_report() return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Any such infections may be treated with banana juice. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom." diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 5e1a97675b..2ebc21adac 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -227,6 +227,7 @@ player_mind.assigned_role = "Morph" player_mind.special_role = "Morph" SSticker.mode.traitors |= player_mind + player_mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(S, S.playstyle_string) SEND_SOUND(S, sound('sound/magic/mutate.ogg')) message_admins("[key_name_admin(S)] has been made into a morph by an event.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 727203b150..78d39673eb 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -87,6 +87,7 @@ mind.assigned_role = "revenant" mind.special_role = "Revenant" SSticker.mode.traitors |= mind //Necessary for announcing + mind.add_antag_datum(/datum/antagonist/auto_custom) AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) diff --git a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm index f1f9624380..e62665f21b 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm @@ -38,6 +38,7 @@ player_mind.assigned_role = "Slaughter Demon" player_mind.special_role = "Slaughter Demon" SSticker.mode.traitors |= player_mind + player_mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") SEND_SOUND(S, 'sound/magic/demon_dies.ogg') diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 94c372ef23..c7fc1bfdc8 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -171,6 +171,7 @@ return FALSE //its a static var btw ..() +<<<<<<< HEAD /datum/game_mode/nuclear/declare_completion() var/disk_rescued = 1 for(var/obj/item/disk/nuclear/D in GLOB.poi_list) @@ -251,12 +252,49 @@ ..() return +======= +/datum/game_mode/nuclear/set_round_result() + var result = nuke_team.get_result() + switch(result) + if(NUKE_RESULT_FLUKE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + SSticker.news_report = NUKE_SYNDICATE_BASE + if(NUKE_RESULT_NUKE_WIN) + SSticker.mode_result = "win - syndicate nuke" + SSticker.news_report = STATION_NUKED + if(NUKE_RESULT_NOSURVIVORS) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + SSticker.news_report = STATION_NUKED + if(NUKE_RESULT_WRONG_STATION) + SSticker.mode_result = "halfwin - blew wrong station" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_WRONG_STATION_DEAD) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_CREW_WIN) + SSticker.mode_result = "loss - evacuation - disk secured" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_DISK_LOST) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + SSticker.news_report = OPERATIVE_SKIRMISH + if(NUKE_RESULT_DISK_STOLEN) + SSticker.mode_result = "halfwin - detonation averted" + SSticker.news_report = OPERATIVE_SKIRMISH + else + SSticker.mode_result = "halfwin - interrupted" + SSticker.news_report = OPERATIVE_SKIRMISH + return ..() +>>>>>>> 3d81385... Roundend report refactor (#33246) /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." +<<<<<<< HEAD /datum/game_mode/proc/auto_declare_completion_nuclear() if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) ) var/text = "
The syndicate operatives were:" @@ -298,6 +336,8 @@ synd_mind.current.real_name = synd_mind.name return +======= +>>>>>>> 3d81385... Roundend report refactor (#33246) /proc/is_nuclear_operative(mob/M) return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates diff --git a/code/game/gamemodes/objective_team.dm b/code/game/gamemodes/objective_team.dm index 7789a167c7..1483f356d2 100644 --- a/code/game/gamemodes/objective_team.dm +++ b/code/game/gamemodes/objective_team.dm @@ -3,6 +3,7 @@ var/list/datum/mind/members = list() var/name = "team" var/member_name = "member" + var/list/objectives = list() //common objectives, these won't be added or removed automatically, subtypes handle this, this is here for bookkeeping purposes. /datum/objective_team/New(starting_members) . = ..() @@ -12,7 +13,6 @@ add_member(M) else add_member(starting_members) - members += starting_members /datum/objective_team/proc/is_solo() return members.len == 1 @@ -21,4 +21,14 @@ members |= new_member /datum/objective_team/proc/remove_member(datum/mind/member) - members -= member \ No newline at end of file + members -= member + +//Display members/victory/failure/objectives for the team +/datum/objective_team/proc/roundend_report() + var/list/report = list() + + report += "[name]:" + report += "The [member_name]s were:" + report += printplayerlist(members) + + return report.Join("
") \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 4fa9532b42..cbfdb98c69 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -169,62 +169,22 @@ return FALSE return TRUE -////////////////////////////////////////////////////////////////////// -//Announces the end of the game with all relavent information stated// -////////////////////////////////////////////////////////////////////// -/datum/game_mode/revolution/declare_completion() + +/datum/game_mode/revolution/set_round_result() + ..() if(finished == 1) SSticker.mode_result = "win - heads killed" - to_chat(world, "The heads of staff were killed or exiled! The revolutionaries win!") - SSticker.news_report = REVS_WIN - else if(finished == 2) SSticker.mode_result = "loss - rev heads killed" - to_chat(world, "The heads of staff managed to stop the revolution!") - SSticker.news_report = REVS_LOSE - ..() - return TRUE -/datum/game_mode/proc/auto_declare_completion_revolution() - var/list/targets = list() - var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head) - var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE) - if(headrevs.len) - var/num_revs = 0 - var/num_survivors = 0 - for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) - if(survivor.ckey) - num_survivors++ - if(survivor.mind) - if(is_revolutionary(survivor)) - num_revs++ - if(num_survivors) - to_chat(world, "[GLOB.TAB]Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%" ) - var/text = "
The head revolutionaries were:" - for(var/datum/mind/headrev in headrevs) - text += printplayer(headrev, 1) - text += "
" - to_chat(world, text) - - if(revs.len) - var/text = "
The revolutionaries were:" - for(var/datum/mind/rev in revs) - text += printplayer(rev, 1) - text += "
" - to_chat(world, text) - - if(revs.len || headrevs.len) - var/text = "
The heads of staff were:" - var/list/heads = SSjob.get_all_heads() - for(var/datum/mind/head in heads) - var/target = (head in targets) - if(target) - text += "Target" - text += printplayer(head, 1) - text += "
" - to_chat(world, text) +//TODO What should be displayed for revs in non-rev rounds +/datum/game_mode/revolution/special_report() + if(finished == 1) + return "The heads of staff were killed or exiled! The revolutionaries win!" + else if(finished == 2) + return "The heads of staff managed to stop the revolution!" /datum/game_mode/revolution/generate_report() return "Employee unrest has spiked in recent weeks, with several attempted mutinies on heads of staff. Some crew have been observed using flashbulb devices to blind their colleagues, \ diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 7c93a89a36..468725074d 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -27,6 +27,7 @@ var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual. var/antag_datum = ANTAG_DATUM_TRAITOR //what type of antag to create + var/traitors_required = TRUE //Will allow no traitors /datum/game_mode/traitor/pre_setup() @@ -55,7 +56,7 @@ log_game("[traitor.key] (ckey) has been selected as a [traitor_name]") antag_candidates.Remove(traitor) - return pre_traitors.len > 0 + return !traitors_required || pre_traitors.len > 0 /datum/game_mode/traitor/post_setup() @@ -85,6 +86,7 @@ new_antag.should_specialise = TRUE character.add_antag_datum(new_antag) +<<<<<<< HEAD /datum/game_mode/traitor/declare_completion() @@ -154,11 +156,12 @@ return TRUE +======= +>>>>>>> 3d81385... Roundend report refactor (#33246) /datum/game_mode/traitor/generate_report() return "Although more specific threats are commonplace, you should always remain vigilant for Syndicate agents aboard your station. Syndicate communications have implied that many \ Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions." - /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR] traitorhud.join_hud(traitor_mind.current) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 484961b6f8..e0b83f4d0a 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -143,7 +143,8 @@ if("VICTIM") var/mob/living/carbon/human/T = target - if(is_sacrifice_target(T.mind)) + var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) + if(C && C.cult_team.is_sacrifice_target(T.mind)) if(iscultist(user)) to_chat(user, "\"This soul is mine. SACRIFICE THEM!\"") else diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 5302ebd39b..6dd38e9d58 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -58,20 +58,13 @@ return TRUE -/datum/game_mode/wizard/declare_completion() +/datum/game_mode/wizard/set_round_result() + ..() if(finished) SSticker.mode_result = "loss - wizard killed" - to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") - SSticker.news_report = WIZARD_KILLED - ..() - return 1 - - -/datum/game_mode/proc/auto_declare_completion_wizard() - if(wizards.len) - var/text = "
the wizards/witches were:" +<<<<<<< HEAD for(var/datum/mind/wizard in wizards) text += "
[wizard.key] was [wizard.name] (" @@ -114,9 +107,12 @@ text += ", " i++ text += "
" +======= +/datum/game_mode/wizard/special_report() + if(finished) + return "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" +>>>>>>> 3d81385... Roundend report refactor (#33246) - to_chat(world, text) - return 1 //returns whether the mob is a wizard (or apprentice) /proc/iswizard(mob/living/M) return M.mind && M.mind.has_antag_datum(/datum/antagonist/wizard,TRUE) diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index fdb481401e..59465cf5b2 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -45,6 +45,7 @@ var/datum/objective/hijack/hijack = new hijack.owner = user.mind user.mind.objectives += hijack + user.mind.add_antag_datum(/datum/antagonist/auto_custom) user.mind.announce_objectives() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 22365c4584..c0859cc318 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -705,15 +705,17 @@ /datum/admins/proc/output_all_devil_info() var/devil_number = 0 - for(var/D in SSticker.mode.devils) + for(var/datum/mind/D in SSticker.mode.devils) devil_number++ - to_chat(usr, "Devil #[devil_number]:

" + SSticker.mode.printdevilinfo(D)) + var/datum/antagonist/devil/devil = D.has_antag_datum(/datum/antagonist/devil) + to_chat(usr, "Devil #[devil_number]:

" + devil.printdevilinfo()) if(!devil_number) to_chat(usr, "No Devils located" ) /datum/admins/proc/output_devil_info(mob/living/M) if(is_devil(M)) - to_chat(usr, SSticker.mode.printdevilinfo(M)) + var/datum/antagonist/devil/devil = M.mind.has_antag_datum(/datum/antagonist/devil) + to_chat(usr, devil.printdevilinfo()) else to_chat(usr, "[M] is not a devil.") diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 8a18dc9ac5..75e43adf51 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -317,11 +317,14 @@ //Assign antag status and the mission SSticker.mode.traitors += Commando.mind Commando.mind.special_role = "deathsquad" + var/datum/objective/missionobj = new missionobj.owner = Commando.mind missionobj.explanation_text = mission missionobj.completed = 1 Commando.mind.objectives += missionobj + + Commando.mind.add_antag_datum(/datum/antagonist/auto_custom) //Greet the commando to_chat(Commando, "You are the [numagents==1?"Deathsquad Officer":"Death Commando"].") @@ -369,11 +372,14 @@ //Assign antag status and the mission SSticker.mode.traitors += newmob.mind newmob.mind.special_role = "official" + var/datum/objective/missionobj = new missionobj.owner = newmob.mind missionobj.explanation_text = mission missionobj.completed = 1 newmob.mind.objectives += missionobj + + newmob.mind.add_antag_datum(/datum/antagonist/auto_custom) if(CONFIG_GET(flag/enforce_human_authority)) newmob.set_species(/datum/species/human) @@ -474,12 +480,15 @@ //Assign antag status and the mission SSticker.mode.traitors += ERTOperative.mind ERTOperative.mind.special_role = "ERT" + var/datum/objective/missionobj = new missionobj.owner = ERTOperative.mind missionobj.explanation_text = mission missionobj.completed = 1 ERTOperative.mind.objectives += missionobj + ERTOperative.mind.add_antag_datum(/datum/antagonist/auto_custom) + //Greet the commando to_chat(ERTOperative, "You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].") var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division." diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index b675815602..d09041aaf3 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -28,6 +28,7 @@ GLOBAL_VAR_INIT(highlander, FALSE) /mob/living/carbon/human/proc/make_scottish() SSticker.mode.traitors += mind mind.special_role = "highlander" + dna.species.species_traits |= NOGUNS //nice try jackass var/datum/objective/steal/steal_objective = new @@ -40,6 +41,8 @@ GLOBAL_VAR_INIT(highlander, FALSE) hijack_objective.owner = mind mind.objectives += hijack_objective + mind.add_antag_datum(/datum/antagonist/auto_custom) + mind.announce_objectives() for(var/obj/item/I in get_equipped_items()) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 3031936d43..1fe8baba01 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -115,9 +115,11 @@ to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") SSticker.mode.traitors += user.mind user.mind.special_role = "traitor" + var/datum/objective/hijack/hijack = new hijack.owner = user.mind user.mind.objectives += hijack + user.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") user.mind.announce_objectives() user.set_species(/datum/species/shadow) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index dbbe6ea512..a7e3b20e7a 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -68,3 +68,9 @@ var/datum/chatOutput/chatOutput +<<<<<<< HEAD +======= + var/list/credits //lazy list of all credit object bound to this client + + var/datum/player_details/player_details //these persist between logins/logouts during the same round. +>>>>>>> 3d81385... Roundend report refactor (#33246) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 43ae694b84..fc00ae3828 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -222,6 +222,13 @@ GLOBAL_LIST(external_rsc_urls) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(C)] (no longer logged in). ") log_access("Notice: [key_name(src)] has the same [matches] as [key_name(C)] (no longer logged in).") + if(GLOB.player_details[ckey]) + player_details = GLOB.player_details[ckey] + else + player_details = new + GLOB.player_details[ckey] = player_details + + . = ..() //calls mob.Login() chatOutput.start() // Starts the chat diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm new file mode 100644 index 0000000000..a842607235 --- /dev/null +++ b/code/modules/client/player_details.dm @@ -0,0 +1,2 @@ +/datum/player_details + var/list/player_actions = list() \ No newline at end of file diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index f983ca2563..7ec7d75bac 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -135,7 +135,7 @@ "You pin \the [src] on [M]'s chest.") if(input) SSblackbox.record_feedback("associative", "commendation", 1, list("commender" = "[user.real_name]", "commendee" = "[M.real_name]", "medal" = "[src]", "reason" = input)) - GLOB.commendations += "[user.real_name] awarded [M.real_name] the [name]! \n- [input]" + GLOB.commendations += "[user.real_name] awarded [M.real_name] the [name]! \n- [input]" commended = TRUE log_game("[key_name(M)] was given the following commendation by [key_name(user)]: [input]") message_admins("[key_name(M)] was given the following commendation by [key_name(user)]: [input]") diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 41ff90407d..abb5a0639d 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -45,19 +45,26 @@ to_chat(L, "You didn't get a date! They're all having fun without you! you'll show them though...") var/datum/objective/martyr/normiesgetout = new normiesgetout.owner = L.mind + L.mind.special_role = "heartbreaker" SSticker.mode.traitors |= L.mind L.mind.objectives += normiesgetout + L.mind.add_antag_datum(/datum/antagonist/auto_custom) + /proc/forge_valentines_objective(mob/living/lover,mob/living/date) SSticker.mode.traitors |= lover.mind lover.mind.special_role = "valentine" + var/datum/objective/protect/protect_objective = new /datum/objective/protect protect_objective.owner = lover.mind protect_objective.target = date.mind protect_objective.explanation_text = "Protect [date.real_name], your date." lover.mind.objectives += protect_objective + + lover.mind.add_antag_datum(/datum/antagonist/auto_custom) + to_chat(lover, "You're on a date with [date]! Protect them at all costs. This takes priority over all other loyalties.") diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 073ef8aea3..76188cb5b7 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -35,6 +35,7 @@ player_mind.assigned_role = "Nightmare" player_mind.special_role = "Nightmare" SSticker.mode.traitors += player_mind + player_mind.add_antag_datum(/datum/antagonist/auto_custom) S.set_species(/datum/species/shadow/nightmare) playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1) message_admins("[key_name_admin(S)] has been made into a Nightmare by an event.") diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm index 618c746a65..3227f81d58 100644 --- a/code/modules/events/wizard/departmentrevolt.dm +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -44,6 +44,7 @@ citizens += H SSticker.mode.traitors += M M.special_role = "separatist" + M.add_antag_datum(/datum/antagonist/auto_custom) H.log_message("Was made into a separatist, long live [nation]!", INDIVIDUAL_ATTACK_LOG) to_chat(H, "You are a separatist! [nation] forever! Protect the sovereignty of your newfound land with your comrades in arms!") if(citizens.len) diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 6ee000249b..1cf4858ce7 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -67,6 +67,7 @@ O.completed = 1 //YES! O.owner = new_holder.mind new_holder.mind.objectives += O + new_holder.mind.add_antag_datum(/datum/antagonist/auto_custom) new_holder.log_message("Won with greentext!!!", INDIVIDUAL_ATTACK_LOG) color_altered_mobs -= new_holder resistance_flags |= ON_FIRE diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index aab1f204f6..d09f8cd4a2 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -50,6 +50,7 @@ if(!mind.special_role) mind.special_role = "traitor" SSticker.mode.traitors += mind + mind.add_antag_datum(/datum/antagonist/auto_custom) // ???? /mob/living/silicon/robot/update_health_hud() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 0e6ecf1672..8046daf55d 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -360,8 +360,14 @@ ..() /datum/action/innate/seek_master/Activate() - if(!SSticker.mode.eldergod) - the_construct.master = GLOB.blood_target + var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult) + if(!C) + return + var/datum/objective/eldergod/summon_objective = locate() in C.cult_team.objectives + + if(summon_objective.check_completion()) + the_construct.master = C.cult_team.blood_target + if(!the_construct.master) to_chat(the_construct, "You have no master to seek!") the_construct.seeking = FALSE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 3aa1153133..65ef28baee 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -153,7 +153,7 @@ /mob/living/simple_animal/drone/cogscarab/Login() ..() - add_servant_of_ratvar(src, TRUE) + add_servant_of_ratvar(src, TRUE, GLOB.servants_active) to_chat(src,"You yourself are one of these servants, and will be able to utilize almost anything they can[GLOB.ratvar_awakens ? "":", excluding a clockwork slab"].") // this can't go with flavortext because i'm assuming it requires them to be ratvar'd /mob/living/simple_animal/drone/cogscarab/binarycheck() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index e7608f524b..5a10b3183b 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -48,6 +48,10 @@ client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed. + if(client.player_details.player_actions.len) + for(var/datum/action/A in client.player_details.player_actions) + A.Grant(src) + if(!GLOB.individual_log_list[ckey]) GLOB.individual_log_list[ckey] = logging else diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 1656a43505..b26d01d880 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -95,7 +95,7 @@ Contents: var/datum/mind/Mind = new /datum/mind(key) Mind.assigned_role = "Space Ninja" Mind.special_role = "Space Ninja" - SSticker.mode.traitors |= Mind //Adds them to current traitor list. Which is really the extra antagonist list. + SSticker.mode.traitors |= Mind //Adds them to current traitor list. TODO : Remove this in admin tools refeactor. return Mind diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 22712e970d..9801e98614 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -47,8 +47,15 @@ /obj/singularity/narsie/large/cult/Initialize() . = ..() GLOB.cult_narsie = src - deltimer(GLOB.blood_target_reset_timer) - GLOB.blood_target = src + var/list/all_cults = list() + for(var/datum/antagonist/cult/C in GLOB.antagonists) + all_cults |= C.cult_team + for(var/datum/objective_team/cult/T in all_cults) + deltimer(T.blood_target_reset_timer) + T.blood_target = src + var/datum/objective/eldergod/summon_objective = locate() in T.objectives + if(summon_objective) + summon_objective.summoned = TRUE for(var/datum/mind/cult_mind in SSticker.mode.cult) if(isliving(cult_mind.current)) var/mob/living/L = cult_mind.current diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index b992871004..7ab3121a3a 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -22,12 +22,14 @@ guns.owner = H.mind H.mind.objectives += guns H.mind.special_role = "survivalist" + H.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(H, "You are the survivalist! Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way.") else var/datum/objective/steal_five_of_type/summon_magic/magic = new magic.owner = H.mind H.mind.objectives += magic H.mind.special_role = "amateur magician" + H.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(H, "You are the amateur magician! Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way.") var/datum/objective/survive/survive = new survive.owner = H.mind diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 98ec01f641..88377455c6 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -26,11 +26,11 @@ /datum/station_goal/proc/check_completion() return completed -/datum/station_goal/proc/print_result() +/datum/station_goal/proc/get_result() if(check_completion()) - to_chat(world, "Station Goal : [name] : Completed!") + return "
  • [name] : Completed!
  • " else - to_chat(world, "Station Goal : [name] : Failed!") + return "
  • [name] : Failed!
  • " /datum/station_goal/Destroy() SSticker.mode.station_goals -= src diff --git a/html/browser/roundend.css b/html/browser/roundend.css new file mode 100644 index 0000000000..82235f1273 --- /dev/null +++ b/html/browser/roundend.css @@ -0,0 +1,67 @@ +.greentext { + color: #90ee90; + font-weight: bold; +} + +.greentext_alt { + color: green; +} +.redtext { + color: #ef2f3c; + font-weight: bold; +} +.neutraltext { + font-weight: bold; /* If you feel these should have some color feel free to change */ +} + +.marooned { + color: rgb(109, 109, 255); font-weight: bold; +} + +.header { + font-size: 24px; font-weight: bold; +} + +.big { + font-size: 24px; +} + +.medaltext { + color: #add8e6; +} + +.codephrase { + color : #ef2f3c; +} + +.redborder { + border-bottom: 2px solid #ef2f3c; +} + +.greenborder { + border-bottom: 2px solid #90ee90; +} + +.clockborder { + border-bottom: 2px solid #B18B25; +} + +.stationborder { + border-bottom: 2px solid #add8e6; +} + +li { + margin-bottom: 0.2rem; +} + +.panel { + background-color: #313131; + padding: 10px; + border-radius: 10px; + margin-bottom: 5px; +} + +body { + background-color: #272727; + color: #efefef; +} \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 79e277a91b..44c5e2dd93 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -107,6 +107,7 @@ #include "code\__HELPERS\pronouns.dm" #include "code\__HELPERS\radiation.dm" #include "code\__HELPERS\radio.dm" +#include "code\__HELPERS\roundend.dm" #include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\shell.dm" #include "code\__HELPERS\stat_tracking.dm" @@ -1301,6 +1302,7 @@ #include "code\modules\client\client_colour.dm" #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" +#include "code\modules\client\player_details.dm" #include "code\modules\client\message.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_savefile.dm" From d45b668a390ca0c97cf4df7315cf51a892731414 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 14 Dec 2017 18:23:10 -0500 Subject: [PATCH 02/97] Adds config inclusion system --- code/__DEFINES/configuration.dm | 2 - .../controllers/configuration/config_entry.dm | 4 +- .../configuration/configuration.dm | 44 +- .../configuration/entries/comms.dm | 14 +- .../configuration/entries/config.dm | 390 ------------------ .../configuration/entries/dbconfig.dm | 16 +- .../configuration/entries/game_options.dm | 176 ++++---- .../configuration/entries/general.dm | 388 +++++++++++++++++ config/config.txt | 6 + tgstation.dme | 2 +- 10 files changed, 527 insertions(+), 515 deletions(-) delete mode 100644 code/controllers/configuration/entries/config.dm create mode 100644 code/controllers/configuration/entries/general.dm diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm index 3db0ca24c2..c4ef8e6606 100644 --- a/code/__DEFINES/configuration.dm +++ b/code/__DEFINES/configuration.dm @@ -1,8 +1,6 @@ //config files -#define CONFIG_DEF(X) /datum/config_entry/##X { resident_file = CURRENT_RESIDENT_FILE }; /datum/config_entry/##X #define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X) #define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y) -#define CONFIG_TWEAK(X) /datum/config_entry/##X #define CONFIG_MAPS_FILE "maps.txt" diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 92dcb9baf0..7e6f481392 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -9,7 +9,7 @@ var/value var/default //read-only, just set value directly - var/resident_file //the file which this belongs to, must be set + var/resident_file //the file which this was loaded from, if any var/modified = FALSE //set to TRUE if the default has been overridden by a config entry var/protection = NONE @@ -18,8 +18,6 @@ var/dupes_allowed = FALSE /datum/config_entry/New() - if(!resident_file) - CRASH("Config entry [type] has no resident_file set") if(type == abstract_type) CRASH("Abstract config entry [type] instatiated!") name = lowertext(type2top(type)) diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index e9c0aa71b8..f411bd65d3 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -20,10 +20,13 @@ GLOBAL_PROTECT(config_dir) /datum/controller/configuration/New() config = src - var/list/config_files = InitEntries() + InitEntries() LoadModes() - for(var/I in config_files) - LoadEntries(I) + if(!LoadEntries("config.txt")) + log_config("No $include directives found in config.txt! Loading legacy game_options/dbconfig/comms files...") + LoadEntries("game_options.txt") + LoadEntries("dbconfig.txt") + LoadEntries("comms.txt") loadmaplist(CONFIG_MAPS_FILE) /datum/controller/configuration/Destroy() @@ -42,8 +45,6 @@ GLOBAL_PROTECT(config_dir) var/list/_entries_by_type = list() entries_by_type = _entries_by_type - . = list() - for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case var/datum/config_entry/E = I if(initial(E.abstract_type) == I) @@ -57,24 +58,30 @@ GLOBAL_PROTECT(config_dir) continue _entries[esname] = E _entries_by_type[I] = E - .[E.resident_file] = TRUE /datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE) entries -= CE.name entries_by_type -= CE.type -/datum/controller/configuration/proc/LoadEntries(filename) +/datum/controller/configuration/proc/LoadEntries(filename, list/stack = list()) + var/filename_to_test = world.system_type == MS_WINDOWS ? lowertext(filename) : filename + if(filename_to_test in stack) + log_config("Warning: Config recursion detected ([english_list(stack)]), breaking!") + return + stack = stack + filename_to_test + log_config("Loading config file [filename]...") var/list/lines = world.file2list("[GLOB.config_dir][filename]") var/list/_entries = entries for(var/L in lines) if(!L) continue - - if(copytext(L, 1, 2) == "#") + + var/firstchar = copytext(L, 1, 2) + if(firstchar == "#") continue - var/lockthis = copytext(L, 1, 2) == "@" + var/lockthis = firstchar == "@" if(lockthis) L = copytext(L, 2) @@ -91,14 +98,17 @@ GLOBAL_PROTECT(config_dir) if(!entry) continue + if(entry == "$include") + if(!value) + log_config("Warning: Invalid $include directive: [value]") + else + LoadEntries(value, stack) + continue + var/datum/config_entry/E = _entries[entry] if(!E) log_config("Unknown setting in configuration: '[entry]'") continue - - if(filename != E.resident_file) - log_config("Found [entry] in [filename] when it should have been in [E.resident_file]! Ignoring.") - continue if(lockthis) E.protection |= CONFIG_ENTRY_LOCKED @@ -107,10 +117,14 @@ GLOBAL_PROTECT(config_dir) if(!validated) log_config("Failed to validate setting \"[value]\" for [entry]") else if(E.modified && !E.dupes_allowed) - log_config("Duplicate setting for [entry] ([value]) detected! Using latest.") + log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") + + E.resident_file = filename if(validated) E.modified = TRUE + + . = TRUE /datum/controller/configuration/can_vv_get(var_name) return (var_name != "entries_by_type" || !hiding_entries_by_type) && ..() diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm index bf099f6cb6..70197b6fd4 100644 --- a/code/controllers/configuration/entries/comms.dm +++ b/code/controllers/configuration/entries/comms.dm @@ -1,22 +1,24 @@ -#define CURRENT_RESIDENT_FILE "comms.txt" - -CONFIG_DEF(string/comms_key) +/datum/config_entry/string/comms_key protection = CONFIG_ENTRY_HIDDEN /datum/config_entry/string/comms_key/ValidateAndSet(str_val) return str_val != "default_pwd" && length(str_val) > 6 && ..() +<<<<<<< HEAD CONFIG_DEF(string/cross_server_address) +======= +/datum/config_entry/keyed_string_list/cross_server +>>>>>>> 8c537ea... Adds config inclusion system (#33307) protection = CONFIG_ENTRY_LOCKED /datum/config_entry/string/cross_server_address/ValidateAndSet(str_val) return str_val != "byond:\\address:port" && ..() -CONFIG_DEF(string/cross_comms_name) +/datum/config_entry/string/cross_comms_name GLOBAL_VAR_INIT(medals_enabled, TRUE) //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls. -CONFIG_DEF(string/medal_hub_address) +/datum/config_entry/string/medal_hub_address -CONFIG_DEF(string/medal_hub_password) +/datum/config_entry/string/medal_hub_password protection = CONFIG_ENTRY_HIDDEN \ No newline at end of file diff --git a/code/controllers/configuration/entries/config.dm b/code/controllers/configuration/entries/config.dm deleted file mode 100644 index 37081c15dd..0000000000 --- a/code/controllers/configuration/entries/config.dm +++ /dev/null @@ -1,390 +0,0 @@ -#define CURRENT_RESIDENT_FILE "config.txt" - -CONFIG_DEF(flag/autoadmin) // if autoadmin is enabled - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(string/autoadmin_rank) // the rank for autoadmins - value = "Game Master" - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(string/servername) // server name (the name of the game window) - -CONFIG_DEF(string/serversqlname) // short form server name used for the DB - -CONFIG_DEF(string/stationname) // station name (the name of the station in-game) - -CONFIG_DEF(number/lobby_countdown) // In between round countdown. - value = 120 - min_val = 0 - -CONFIG_DEF(number/round_end_countdown) // Post round murder death kill countdown - value = 25 - min_val = 0 - -CONFIG_DEF(flag/hub) // if the game appears on the hub or not - -CONFIG_DEF(flag/log_ooc) // log OOC channel - -CONFIG_DEF(flag/log_access) // log login/logout - -CONFIG_DEF(flag/log_say) // log client say - -CONFIG_DEF(flag/log_admin) // log admin actions - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(flag/log_prayer) // log prayers - -CONFIG_DEF(flag/log_law) // log lawchanges - -CONFIG_DEF(flag/log_game) // log game events - -CONFIG_DEF(flag/log_vote) // log voting - -CONFIG_DEF(flag/log_whisper) // log client whisper - -CONFIG_DEF(flag/log_attack) // log attack messages - -CONFIG_DEF(flag/log_emote) // log emotes - -CONFIG_DEF(flag/log_adminchat) // log admin chat messages - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(flag/log_pda) // log pda messages - -CONFIG_DEF(flag/log_twitter) // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. - -CONFIG_DEF(flag/log_world_topic) // log all world.Topic() calls - -CONFIG_DEF(flag/log_manifest) // log crew manifest to seperate file - -CONFIG_DEF(flag/allow_admin_ooccolor) // Allows admins with relevant permissions to have their own ooc colour - -CONFIG_DEF(flag/allow_vote_restart) // allow votes to restart - -CONFIG_DEF(flag/allow_vote_mode) // allow votes to change mode - -CONFIG_DEF(number/vote_delay) // minimum time between voting sessions (deciseconds, 10 minute default) - value = 6000 - min_val = 0 - -CONFIG_DEF(number/vote_period) // length of voting period (deciseconds, default 1 minute) - value = 600 - min_val = 0 - -CONFIG_DEF(flag/default_no_vote) // vote does not default to nochange/norestart - -CONFIG_DEF(flag/no_dead_vote) // dead people can't vote - -CONFIG_DEF(flag/allow_metadata) // Metadata is supported. - -CONFIG_DEF(flag/popup_admin_pm) // adminPMs to non-admins show in a pop-up 'reply' window when set - -CONFIG_DEF(number/fps) - value = 20 - min_val = 1 - max_val = 100 //byond will start crapping out at 50, so this is just ridic - var/sync_validate = FALSE - -/datum/config_entry/number/fps/ValidateAndSet(str_val) - . = ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] - if(!TL.sync_validate) - TL.ValidateAndSet(10 / value) - sync_validate = FALSE - -CONFIG_DEF(number/ticklag) - integer = FALSE - var/sync_validate = FALSE - -/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps - var/datum/config_entry/CE = /datum/config_entry/number/fps - value = 10 / initial(CE.value) - ..() - -/datum/config_entry/number/ticklag/ValidateAndSet(str_val) - . = text2num(str_val) > 0 && ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] - if(!FPS.sync_validate) - FPS.ValidateAndSet(10 / value) - sync_validate = FALSE - -CONFIG_DEF(flag/allow_holidays) - -CONFIG_DEF(number/tick_limit_mc_init) //SSinitialization throttling - value = TICK_LIMIT_MC_INIT_DEFAULT - min_val = 0 //oranges warned us - integer = FALSE - -CONFIG_DEF(flag/admin_legacy_system) //Defines whether the server uses the legacy admin system with admins.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(string/hostedby) - -CONFIG_DEF(flag/norespawn) - -CONFIG_DEF(flag/guest_jobban) - -CONFIG_DEF(flag/usewhitelist) - -CONFIG_DEF(flag/ban_legacy_system) //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(flag/use_age_restriction_for_jobs) //Do jobs use account age restrictions? --requires database - -CONFIG_DEF(flag/use_account_age_for_jobs) //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. - -CONFIG_DEF(flag/use_exp_tracking) - -CONFIG_DEF(flag/use_exp_restrictions_heads) - -CONFIG_DEF(number/use_exp_restrictions_heads_hours) - value = 0 - min_val = 0 - -CONFIG_DEF(flag/use_exp_restrictions_heads_department) - -CONFIG_DEF(flag/use_exp_restrictions_other) - -CONFIG_DEF(flag/use_exp_restrictions_admin_bypass) - -CONFIG_DEF(string/server) - -CONFIG_DEF(string/banappeals) - -CONFIG_DEF(string/wikiurl) - value = "http://www.tgstation13.org/wiki" - -CONFIG_DEF(string/forumurl) - value = "http://tgstation13.org/phpBB/index.php" - -CONFIG_DEF(string/rulesurl) - value = "http://www.tgstation13.org/wiki/Rules" - -CONFIG_DEF(string/githuburl) - value = "https://www.github.com/tgstation/-tg-station" - -CONFIG_DEF(number/githubrepoid) - value = null - min_val = 0 - -CONFIG_DEF(flag/guest_ban) - -CONFIG_DEF(number/id_console_jobslot_delay) - value = 30 - min_val = 0 - -CONFIG_DEF(number/inactivity_period) //time in ds until a player is considered inactive) - value = 3000 - min_val = 0 - -/datum/config_entry/number/inactivity_period/ValidateAndSet(str_val) - . = ..() - if(.) - value *= 10 //documented as seconds in config.txt - -CONFIG_DEF(number/afk_period) //time in ds until a player is considered inactive) - value = 3000 - min_val = 0 - -/datum/config_entry/number/afk_period/ValidateAndSet(str_val) - . = ..() - if(.) - value *= 10 //documented as seconds in config.txt - -CONFIG_DEF(flag/kick_inactive) //force disconnect for inactive players - -CONFIG_DEF(flag/load_jobs_from_txt) - -CONFIG_DEF(flag/forbid_singulo_possession) - -CONFIG_DEF(flag/automute_on) //enables automuting/spam prevention - -CONFIG_DEF(string/panic_server_name) - -/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) - return str_val != "\[Put the name here\]" && ..() - -CONFIG_DEF(string/panic_server_address) //Reconnect a player this linked server if this server isn't accepting new players - -/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) - return str_val != "byond://address:port" && ..() - -CONFIG_DEF(string/invoke_youtubedl) - protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN - -CONFIG_DEF(flag/show_irc_name) - -CONFIG_DEF(flag/see_own_notes) //Can players see their own admin notes (read-only)? - -CONFIG_DEF(number/note_fresh_days) - value = null - min_val = 0 - integer = FALSE - -CONFIG_DEF(number/note_stale_days) - value = null - min_val = 0 - integer = FALSE - -CONFIG_DEF(flag/maprotation) - -CONFIG_DEF(number/maprotatechancedelta) - value = 0.75 - min_val = 0 - max_val = 1 - integer = FALSE - -CONFIG_DEF(number/soft_popcap) - value = null - min_val = 0 - -CONFIG_DEF(number/hard_popcap) - value = null - min_val = 0 - -CONFIG_DEF(number/extreme_popcap) - value = null - min_val = 0 - -CONFIG_DEF(string/soft_popcap_message) - value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." - -CONFIG_DEF(string/hard_popcap_message) - value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." - -CONFIG_DEF(string/extreme_popcap_message) - value = "The server is currently serving a high number of users, find alternative servers." - -CONFIG_DEF(flag/panic_bunker) // prevents people the server hasn't seen before from connecting - -CONFIG_DEF(number/notify_new_player_age) // how long do we notify admins of a new player - min_val = -1 - -CONFIG_DEF(number/notify_new_player_account_age) // how long do we notify admins of a new byond account - min_val = 0 - -CONFIG_DEF(flag/irc_first_connection_alert) // do we notify the irc channel when somebody is connecting for the first time? - -CONFIG_DEF(flag/check_randomizer) - -CONFIG_DEF(string/ipintel_email) - -/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) - return str_val != "ch@nge.me" && ..() - -CONFIG_DEF(number/ipintel_rating_bad) - value = 1 - integer = FALSE - min_val = 0 - max_val = 1 - -CONFIG_DEF(number/ipintel_save_good) - value = 12 - min_val = 0 - -CONFIG_DEF(number/ipintel_save_bad) - value = 1 - min_val = 0 - -CONFIG_DEF(string/ipintel_domain) - value = "check.getipintel.net" - -CONFIG_DEF(flag/aggressive_changelog) - -CONFIG_DEF(flag/autoconvert_notes) //if all connecting player's notes should attempt to be converted to the database - protection = CONFIG_ENTRY_LOCKED - -CONFIG_DEF(flag/allow_webclient) - -CONFIG_DEF(flag/webclient_only_byond_members) - -CONFIG_DEF(flag/announce_admin_logout) - -CONFIG_DEF(flag/announce_admin_login) - -CONFIG_DEF(flag/allow_map_voting) - -CONFIG_DEF(flag/generate_minimaps) - -CONFIG_DEF(number/client_warn_version) - value = null - min_val = 500 - max_val = DM_VERSION - 1 - -CONFIG_DEF(string/client_warn_message) - value = "Your version of byond may have issues or be blocked from accessing this server in the future." - -CONFIG_DEF(flag/client_warn_popup) - -CONFIG_DEF(number/client_error_version) - value = null - min_val = 500 - max_val = DM_VERSION - 1 - -CONFIG_DEF(string/client_error_message) - value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." - -CONFIG_DEF(number/minute_topic_limit) - value = null - min_val = 0 - -CONFIG_DEF(number/second_topic_limit) - value = null - min_val = 0 - -CONFIG_DEF(number/error_cooldown) // The "cooldown" time for each occurrence of a unique error) - value = 600 - min_val = 0 - -CONFIG_DEF(number/error_limit) // How many occurrences before the next will silence them - value = 50 - -CONFIG_DEF(number/error_silence_time) // How long a unique error will be silenced for - value = 6000 - -CONFIG_DEF(number/error_msg_delay) // How long to wait between messaging admins about occurrences of a unique error - value = 50 - -CONFIG_DEF(flag/irc_announce_new_game) - -CONFIG_DEF(flag/debug_admin_hrefs) - -CONFIG_DEF(number/mc_tick_rate/base_mc_tick_rate) - integer = FALSE - value = 1 - -CONFIG_DEF(number/mc_tick_rate/high_pop_mc_tick_rate) - integer = FALSE - value = 1.1 - -CONFIG_DEF(number/mc_tick_rate/high_pop_mc_mode_amount) - value = 65 - -CONFIG_DEF(number/mc_tick_rate/disable_high_pop_mc_mode_amount) - value = 60 - -CONFIG_TWEAK(number/mc_tick_rate) - abstract_type = /datum/config_entry/number/mc_tick_rate - -CONFIG_TWEAK(number/mc_tick_rate/ValidateAndSet(str_val)) - . = ..() - if (.) - Master.UpdateTickRate() - -CONFIG_DEF(flag/resume_after_initializations) - -CONFIG_TWEAK(flag/resume_after_initializations/ValidateAndSet(str_val)) - . = ..() - if(. && Master.current_runlevel) - world.sleep_offline = !value - -CONFIG_DEF(number/rounds_until_hard_restart) - value = -1 - min_val = 0 - -CONFIG_DEF(string/default_view) - value = "15x15" diff --git a/code/controllers/configuration/entries/dbconfig.dm b/code/controllers/configuration/entries/dbconfig.dm index c46880686a..1ac4d85419 100644 --- a/code/controllers/configuration/entries/dbconfig.dm +++ b/code/controllers/configuration/entries/dbconfig.dm @@ -1,28 +1,26 @@ -#define CURRENT_RESIDENT_FILE "dbconfig.txt" - -CONFIG_DEF(flag/sql_enabled) // for sql switching +/datum/config_entry/flag/sql_enabled // for sql switching protection = CONFIG_ENTRY_LOCKED -CONFIG_DEF(string/address) +/datum/config_entry/string/address value = "localhost" protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -CONFIG_DEF(number/port) +/datum/config_entry/number/port value = 3306 min_val = 0 max_val = 65535 protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -CONFIG_DEF(string/feedback_database) +/datum/config_entry/string/feedback_database value = "test" protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -CONFIG_DEF(string/feedback_login) +/datum/config_entry/string/feedback_login value = "root" protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -CONFIG_DEF(string/feedback_password) +/datum/config_entry/string/feedback_password protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -CONFIG_DEF(string/feedback_tableprefix) +/datum/config_entry/string/feedback_tableprefix protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index b04d7845f5..4fa6133883 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -1,247 +1,245 @@ -#define CURRENT_RESIDENT_FILE "game_options.txt" +/datum/config_entry/number_list/repeated_mode_adjust -CONFIG_DEF(number_list/repeated_mode_adjust) - -CONFIG_DEF(keyed_number_list/probability) +/datum/config_entry/keyed_number_list/probability /datum/config_entry/keyed_number_list/probability/ValidateKeyName(key_name) return key_name in config.modes -CONFIG_DEF(keyed_number_list/max_pop) +/datum/config_entry/keyed_number_list/max_pop /datum/config_entry/keyed_number_list/max_pop/ValidateKeyName(key_name) return key_name in config.modes -CONFIG_DEF(keyed_number_list/min_pop) +/datum/config_entry/keyed_number_list/min_pop /datum/config_entry/keyed_number_list/min_pop/ValidateKeyName(key_name) return key_name in config.modes -CONFIG_DEF(keyed_flag_list/continuous) // which roundtypes continue if all antagonists die +/datum/config_entry/keyed_flag_list/continuous // which roundtypes continue if all antagonists die /datum/config_entry/keyed_flag_list/continuous/ValidateKeyName(key_name) return key_name in config.modes -CONFIG_DEF(keyed_flag_list/midround_antag) // which roundtypes use the midround antagonist system +/datum/config_entry/keyed_flag_list/midround_antag // which roundtypes use the midround antagonist system /datum/config_entry/keyed_flag_list/midround_antag/ValidateKeyName(key_name) return key_name in config.modes -CONFIG_DEF(keyed_string_list/policy) +/datum/config_entry/keyed_string_list/policy -CONFIG_DEF(number/damage_multiplier) +/datum/config_entry/number/damage_multiplier value = 1 integer = FALSE -CONFIG_DEF(number/minimal_access_threshold) //If the number of players is larger than this threshold, minimal access will be turned on. +/datum/config_entry/number/minimal_access_threshold //If the number of players is larger than this threshold, minimal access will be turned on. min_val = 0 -CONFIG_DEF(flag/jobs_have_minimal_access) //determines whether jobs use minimal access or expanded access. +/datum/config_entry/flag/jobs_have_minimal_access //determines whether jobs use minimal access or expanded access. -CONFIG_DEF(flag/assistants_have_maint_access) +/datum/config_entry/flag/assistants_have_maint_access -CONFIG_DEF(flag/security_has_maint_access) +/datum/config_entry/flag/security_has_maint_access -CONFIG_DEF(flag/everyone_has_maint_access) +/datum/config_entry/flag/everyone_has_maint_access -CONFIG_DEF(flag/sec_start_brig) //makes sec start in brig instead of dept sec posts +/datum/config_entry/flag/sec_start_brig //makes sec start in brig instead of dept sec posts -CONFIG_DEF(flag/force_random_names) +/datum/config_entry/flag/force_random_names -CONFIG_DEF(flag/humans_need_surnames) +/datum/config_entry/flag/humans_need_surnames -CONFIG_DEF(flag/allow_ai) // allow ai job +/datum/config_entry/flag/allow_ai // allow ai job -CONFIG_DEF(flag/disable_secborg) // disallow secborg module to be chosen. +/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. -CONFIG_DEF(flag/disable_peaceborg) +/datum/config_entry/flag/disable_peaceborg -CONFIG_DEF(number/traitor_scaling_coeff) //how much does the amount of players get divided by to determine traitors +/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors value = 6 min_val = 1 -CONFIG_DEF(number/brother_scaling_coeff) //how many players per brother team +/datum/config_entry/number/brother_scaling_coeff //how many players per brother team value = 25 min_val = 1 -CONFIG_DEF(number/changeling_scaling_coeff) //how much does the amount of players get divided by to determine changelings +/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings value = 6 min_val = 1 -CONFIG_DEF(number/security_scaling_coeff) //how much does the amount of players get divided by to determine open security officer positions +/datum/config_entry/number/security_scaling_coeff //how much does the amount of players get divided by to determine open security officer positions value = 8 min_val = 1 -CONFIG_DEF(number/abductor_scaling_coeff) //how many players per abductor team +/datum/config_entry/number/abductor_scaling_coeff //how many players per abductor team value = 15 min_val = 1 -CONFIG_DEF(number/traitor_objectives_amount) +/datum/config_entry/number/traitor_objectives_amount value = 2 min_val = 0 -CONFIG_DEF(number/brother_objectives_amount) +/datum/config_entry/number/brother_objectives_amount value = 2 min_val = 0 -CONFIG_DEF(flag/reactionary_explosions) //If we use reactionary explosions, explosions that react to walls and doors +/datum/config_entry/flag/reactionary_explosions //If we use reactionary explosions, explosions that react to walls and doors -CONFIG_DEF(flag/protect_roles_from_antagonist) //If security and such can be traitor/cult/other +/datum/config_entry/flag/protect_roles_from_antagonist //If security and such can be traitor/cult/other -CONFIG_DEF(flag/protect_assistant_from_antagonist) //If assistants can be traitor/cult/other +/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other -CONFIG_DEF(flag/enforce_human_authority) //If non-human species are barred from joining as a head of staff +/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff -CONFIG_DEF(flag/allow_latejoin_antagonists) // If late-joining players can be traitor/changeling +/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling -CONFIG_DEF(number/midround_antag_time_check) // How late (in minutes) you want the midround antag system to stay on, setting this to 0 will disable the system +/datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) value = 60 min_val = 0 -CONFIG_DEF(number/midround_antag_life_check) // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist +/datum/config_entry/number/midround_antag_life_check // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist value = 0.7 integer = FALSE min_val = 0 max_val = 1 -CONFIG_DEF(number/shuttle_refuel_delay) +/datum/config_entry/number/shuttle_refuel_delay value = 12000 min_val = 0 -CONFIG_DEF(flag/show_game_type_odds) //if set this allows players to see the odds of each roundtype on the get revision screen +/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen -CONFIG_DEF(keyed_flag_list/roundstart_races) //races you can play as from the get go. +/datum/config_entry/keyed_flag_list/roundstart_races //races you can play as from the get go. -CONFIG_DEF(flag/join_with_mutant_humans) //players can pick mutant bodyparts for humans before joining the game +/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game -CONFIG_DEF(flag/no_summon_guns) //No +/datum/config_entry/flag/no_summon_guns //No -CONFIG_DEF(flag/no_summon_magic) //Fun +/datum/config_entry/flag/no_summon_magic //Fun -CONFIG_DEF(flag/no_summon_events) //Allowed +/datum/config_entry/flag/no_summon_events //Allowed -CONFIG_DEF(flag/no_intercept_report) //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes. +/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes. -CONFIG_DEF(number/arrivals_shuttle_dock_window) //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station +/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station value = 55 min_val = 30 -CONFIG_DEF(flag/arrivals_shuttle_require_undocked) //Require the arrivals shuttle to be undocked before latejoiners can join +/datum/config_entry/flag/arrivals_shuttle_require_undocked //Require the arrivals shuttle to be undocked before latejoiners can join -CONFIG_DEF(flag/arrivals_shuttle_require_safe_latejoin) //Require the arrivals shuttle to be operational in order for latejoiners to join +/datum/config_entry/flag/arrivals_shuttle_require_safe_latejoin //Require the arrivals shuttle to be operational in order for latejoiners to join -CONFIG_DEF(string/alert_green) +/datum/config_entry/string/alert_green value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." -CONFIG_DEF(string/alert_blue_upto) +/datum/config_entry/string/alert_blue_upto value = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." -CONFIG_DEF(string/alert_blue_downto) +/datum/config_entry/string/alert_blue_downto value = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." -CONFIG_DEF(string/alert_red_upto) +/datum/config_entry/string/alert_red_upto value = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." -CONFIG_DEF(string/alert_red_downto) +/datum/config_entry/string/alert_red_downto value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." -CONFIG_DEF(string/alert_delta) +/datum/config_entry/string/alert_delta value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." -CONFIG_DEF(flag/revival_pod_plants) +/datum/config_entry/flag/revival_pod_plants -CONFIG_DEF(flag/revival_cloning) +/datum/config_entry/flag/revival_cloning -CONFIG_DEF(number/revival_brain_life) +/datum/config_entry/number/revival_brain_life value = -1 min_val = -1 -CONFIG_DEF(flag/rename_cyborg) +/datum/config_entry/flag/rename_cyborg -CONFIG_DEF(flag/ooc_during_round) +/datum/config_entry/flag/ooc_during_round -CONFIG_DEF(flag/emojis) +/datum/config_entry/flag/emojis -CONFIG_DEF(number/run_delay) //Used for modifying movement speed for mobs. +/datum/config_entry/number/run_delay //Used for modifying movement speed for mobs. var/static/value_cache = 0 -CONFIG_TWEAK(number/run_delay/ValidateAndSet()) +/datum/config_entry/number/run_delay/ValidateAndSet() . = ..() if(.) value_cache = value -CONFIG_DEF(number/walk_delay) +/datum/config_entry/number/walk_delay var/static/value_cache = 0 -CONFIG_TWEAK(number/walk_delay/ValidateAndSet()) +/datum/config_entry/number/walk_delay/ValidateAndSet() . = ..() if(.) value_cache = value -CONFIG_DEF(number/human_delay) //Mob specific modifiers. NOTE: These will affect different mob types in different ways -CONFIG_DEF(number/robot_delay) -CONFIG_DEF(number/monkey_delay) -CONFIG_DEF(number/alien_delay) -CONFIG_DEF(number/slime_delay) -CONFIG_DEF(number/animal_delay) +/datum/config_entry/number/human_delay //Mob specific modifiers. NOTE: These will affect different mob types in different ways +/datum/config_entry/number/robot_delay +/datum/config_entry/number/monkey_delay +/datum/config_entry/number/alien_delay +/datum/config_entry/number/slime_delay +/datum/config_entry/number/animal_delay -CONFIG_DEF(number/gateway_delay) //How long the gateway takes before it activates. Default is half an hour. +/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. value = 18000 min_val = 0 -CONFIG_DEF(flag/ghost_interaction) +/datum/config_entry/flag/ghost_interaction -CONFIG_DEF(flag/silent_ai) -CONFIG_DEF(flag/silent_borg) +/datum/config_entry/flag/silent_ai +/datum/config_entry/flag/silent_borg -CONFIG_DEF(flag/sandbox_autoclose) // close the sandbox panel after spawning an item, potentially reducing griff +/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff -CONFIG_DEF(number/default_laws) //Controls what laws the AI spawns with. +/datum/config_entry/number/default_laws //Controls what laws the AI spawns with. value = 0 min_val = 0 max_val = 3 -CONFIG_DEF(number/silicon_max_law_amount) +/datum/config_entry/number/silicon_max_law_amount value = 12 min_val = 0 -CONFIG_DEF(keyed_flag_list/random_laws) +/datum/config_entry/keyed_flag_list/random_laws -CONFIG_DEF(keyed_number_list/law_weight) +/datum/config_entry/keyed_number_list/law_weight splitter = "," -CONFIG_DEF(number/assistant_cap) +/datum/config_entry/number/assistant_cap value = -1 min_val = -1 -CONFIG_DEF(flag/starlight) -CONFIG_DEF(flag/grey_assistants) +/datum/config_entry/flag/starlight +/datum/config_entry/flag/grey_assistants -CONFIG_DEF(number/lavaland_budget) +/datum/config_entry/number/lavaland_budget value = 60 min_val = 0 -CONFIG_DEF(number/space_budget) +/datum/config_entry/number/space_budget value = 16 min_val = 0 -CONFIG_DEF(flag/allow_random_events) // Enables random events mid-round when set +/datum/config_entry/flag/allow_random_events // Enables random events mid-round when set -CONFIG_DEF(number/events_min_time_mul) // Multipliers for random events minimal starting time and minimal players amounts +/datum/config_entry/number/events_min_time_mul // Multipliers for random events minimal starting time and minimal players amounts value = 1 min_val = 0 integer = FALSE -CONFIG_DEF(number/events_min_players_mul) +/datum/config_entry/number/events_min_players_mul value = 1 min_val = 0 integer = FALSE -CONFIG_DEF(number/mice_roundstart) +/datum/config_entry/number/mice_roundstart value = 10 min_val = 0 -CONFIG_DEF(number/bombcap) +/datum/config_entry/number/bombcap value = 14 min_val = 4 @@ -258,9 +256,9 @@ CONFIG_DEF(flag/allow_extended_miscreants) GLOB.MAX_EX_FLASH_RANGE = value GLOB.MAX_EX_FLAME_RANGE = value -CONFIG_DEF(number/emergency_shuttle_autocall_threshold) +/datum/config_entry/number/emergency_shuttle_autocall_threshold min_val = 0 max_val = 1 integer = FALSE -CONFIG_DEF(flag/ic_printing) +/datum/config_entry/flag/ic_printing diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm new file mode 100644 index 0000000000..637e65c46f --- /dev/null +++ b/code/controllers/configuration/entries/general.dm @@ -0,0 +1,388 @@ +/datum/config_entry/flag/autoadmin // if autoadmin is enabled + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/string/autoadmin_rank // the rank for autoadmins + value = "Game Master" + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/string/servername // server name (the name of the game window) + +/datum/config_entry/string/serversqlname // short form server name used for the DB + +/datum/config_entry/string/stationname // station name (the name of the station in-game) + +/datum/config_entry/number/lobby_countdown // In between round countdown. + value = 120 + min_val = 0 + +/datum/config_entry/number/round_end_countdown // Post round murder death kill countdown + value = 25 + min_val = 0 + +/datum/config_entry/flag/hub // if the game appears on the hub or not + +/datum/config_entry/flag/log_ooc // log OOC channel + +/datum/config_entry/flag/log_access // log login/logout + +/datum/config_entry/flag/log_say // log client say + +/datum/config_entry/flag/log_admin // log admin actions + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/log_prayer // log prayers + +/datum/config_entry/flag/log_law // log lawchanges + +/datum/config_entry/flag/log_game // log game events + +/datum/config_entry/flag/log_vote // log voting + +/datum/config_entry/flag/log_whisper // log client whisper + +/datum/config_entry/flag/log_attack // log attack messages + +/datum/config_entry/flag/log_emote // log emotes + +/datum/config_entry/flag/log_adminchat // log admin chat messages + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/log_pda // log pda messages + +/datum/config_entry/flag/log_twitter // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. + +/datum/config_entry/flag/log_world_topic // log all world.Topic() calls + +/datum/config_entry/flag/log_manifest // log crew manifest to seperate file + +/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour + +/datum/config_entry/flag/allow_vote_restart // allow votes to restart + +/datum/config_entry/flag/allow_vote_mode // allow votes to change mode + +/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default) + value = 6000 + min_val = 0 + +/datum/config_entry/number/vote_period // length of voting period (deciseconds, default 1 minute) + value = 600 + min_val = 0 + +/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart + +/datum/config_entry/flag/no_dead_vote // dead people can't vote + +/datum/config_entry/flag/allow_metadata // Metadata is supported. + +/datum/config_entry/flag/popup_admin_pm // adminPMs to non-admins show in a pop-up 'reply' window when set + +/datum/config_entry/number/fps + value = 20 + min_val = 1 + max_val = 100 //byond will start crapping out at 50, so this is just ridic + var/sync_validate = FALSE + +/datum/config_entry/number/fps/ValidateAndSet(str_val) + . = ..() + if(.) + sync_validate = TRUE + var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] + if(!TL.sync_validate) + TL.ValidateAndSet(10 / value) + sync_validate = FALSE + +/datum/config_entry/number/ticklag + integer = FALSE + var/sync_validate = FALSE + +/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps + var/datum/config_entry/CE = /datum/config_entry/number/fps + value = 10 / initial(CE.value) + ..() + +/datum/config_entry/number/ticklag/ValidateAndSet(str_val) + . = text2num(str_val) > 0 && ..() + if(.) + sync_validate = TRUE + var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] + if(!FPS.sync_validate) + FPS.ValidateAndSet(10 / value) + sync_validate = FALSE + +/datum/config_entry/flag/allow_holidays + +/datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling + value = TICK_LIMIT_MC_INIT_DEFAULT + min_val = 0 //oranges warned us + integer = FALSE + +/datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/string/hostedby + +/datum/config_entry/flag/norespawn + +/datum/config_entry/flag/guest_jobban + +/datum/config_entry/flag/usewhitelist + +/datum/config_entry/flag/ban_legacy_system //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/use_age_restriction_for_jobs //Do jobs use account age restrictions? --requires database + +/datum/config_entry/flag/use_account_age_for_jobs //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. + +/datum/config_entry/flag/use_exp_tracking + +/datum/config_entry/flag/use_exp_restrictions_heads + +/datum/config_entry/number/use_exp_restrictions_heads_hours + value = 0 + min_val = 0 + +/datum/config_entry/flag/use_exp_restrictions_heads_department + +/datum/config_entry/flag/use_exp_restrictions_other + +/datum/config_entry/flag/use_exp_restrictions_admin_bypass + +/datum/config_entry/string/server + +/datum/config_entry/string/banappeals + +/datum/config_entry/string/wikiurl + value = "http://www.tgstation13.org/wiki" + +/datum/config_entry/string/forumurl + value = "http://tgstation13.org/phpBB/index.php" + +/datum/config_entry/string/rulesurl + value = "http://www.tgstation13.org/wiki/Rules" + +/datum/config_entry/string/githuburl + value = "https://www.github.com/tgstation/-tg-station" + +/datum/config_entry/number/githubrepoid + value = null + min_val = 0 + +/datum/config_entry/flag/guest_ban + +/datum/config_entry/number/id_console_jobslot_delay + value = 30 + min_val = 0 + +/datum/config_entry/number/inactivity_period //time in ds until a player is considered inactive + value = 3000 + min_val = 0 + +/datum/config_entry/number/inactivity_period/ValidateAndSet(str_val) + . = ..() + if(.) + value *= 10 //documented as seconds in config.txt + +/datum/config_entry/number/afk_period //time in ds until a player is considered inactive + value = 3000 + min_val = 0 + +/datum/config_entry/number/afk_period/ValidateAndSet(str_val) + . = ..() + if(.) + value *= 10 //documented as seconds in config.txt + +/datum/config_entry/flag/kick_inactive //force disconnect for inactive players + +/datum/config_entry/flag/load_jobs_from_txt + +/datum/config_entry/flag/forbid_singulo_possession + +/datum/config_entry/flag/automute_on //enables automuting/spam prevention + +/datum/config_entry/string/panic_server_name + +/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) + return str_val != "\[Put the name here\]" && ..() + +/datum/config_entry/string/panic_server_address //Reconnect a player this linked server if this server isn't accepting new players + +/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) + return str_val != "byond://address:port" && ..() + +/datum/config_entry/string/invoke_youtubedl + protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN + +/datum/config_entry/flag/show_irc_name + +/datum/config_entry/flag/see_own_notes //Can players see their own admin notes + +/datum/config_entry/number/note_fresh_days + value = null + min_val = 0 + integer = FALSE + +/datum/config_entry/number/note_stale_days + value = null + min_val = 0 + integer = FALSE + +/datum/config_entry/flag/maprotation + +/datum/config_entry/number/maprotatechancedelta + value = 0.75 + min_val = 0 + max_val = 1 + integer = FALSE + +/datum/config_entry/number/soft_popcap + value = null + min_val = 0 + +/datum/config_entry/number/hard_popcap + value = null + min_val = 0 + +/datum/config_entry/number/extreme_popcap + value = null + min_val = 0 + +/datum/config_entry/string/soft_popcap_message + value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." + +/datum/config_entry/string/hard_popcap_message + value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." + +/datum/config_entry/string/extreme_popcap_message + value = "The server is currently serving a high number of users, find alternative servers." + +/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting + +/datum/config_entry/number/notify_new_player_age // how long do we notify admins of a new player + min_val = -1 + +/datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account + min_val = 0 + +/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? + +/datum/config_entry/flag/check_randomizer + +/datum/config_entry/string/ipintel_email + +/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) + return str_val != "ch@nge.me" && ..() + +/datum/config_entry/number/ipintel_rating_bad + value = 1 + integer = FALSE + min_val = 0 + max_val = 1 + +/datum/config_entry/number/ipintel_save_good + value = 12 + min_val = 0 + +/datum/config_entry/number/ipintel_save_bad + value = 1 + min_val = 0 + +/datum/config_entry/string/ipintel_domain + value = "check.getipintel.net" + +/datum/config_entry/flag/aggressive_changelog + +/datum/config_entry/flag/autoconvert_notes //if all connecting player's notes should attempt to be converted to the database + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/allow_webclient + +/datum/config_entry/flag/webclient_only_byond_members + +/datum/config_entry/flag/announce_admin_logout + +/datum/config_entry/flag/announce_admin_login + +/datum/config_entry/flag/allow_map_voting + +/datum/config_entry/flag/generate_minimaps + +/datum/config_entry/number/client_warn_version + value = null + min_val = 500 + max_val = DM_VERSION - 1 + +/datum/config_entry/string/client_warn_message + value = "Your version of byond may have issues or be blocked from accessing this server in the future." + +/datum/config_entry/flag/client_warn_popup + +/datum/config_entry/number/client_error_version + value = null + min_val = 500 + max_val = DM_VERSION - 1 + +/datum/config_entry/string/client_error_message + value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." + +/datum/config_entry/number/minute_topic_limit + value = null + min_val = 0 + +/datum/config_entry/number/second_topic_limit + value = null + min_val = 0 + +/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error + value = 600 + min_val = 0 + +/datum/config_entry/number/error_limit // How many occurrences before the next will silence them + value = 50 + +/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for + value = 6000 + +/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error + value = 50 + +/datum/config_entry/flag/irc_announce_new_game + +/datum/config_entry/flag/debug_admin_hrefs + +/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate + integer = FALSE + value = 1 + +/datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate + integer = FALSE + value = 1.1 + +/datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount + value = 65 + +/datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount + value = 60 + +/datum/config_entry/number/mc_tick_rate + abstract_type = /datum/config_entry/number/mc_tick_rate + +/datum/config_entry/number/mc_tick_rate/ValidateAndSet(str_val) + . = ..() + if (.) + Master.UpdateTickRate() + +/datum/config_entry/flag/resume_after_initializations + +/datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) + . = ..() + if(. && Master.current_runlevel) + world.sleep_offline = !value + +/datum/config_entry/number/rounds_until_hard_restart + value = -1 + min_val = 0 + +/datum/config_entry/string/default_view + value = "15x15" diff --git a/config/config.txt b/config/config.txt index fb648a5fa9..e43b38b568 100644 --- a/config/config.txt +++ b/config/config.txt @@ -1,3 +1,9 @@ +# You can use the "$include" directive to split your configs however you want + +$include game_options.txt +$include dbconfig.txt +$include comms.txt + # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: # @SERVERNAME tgstation diff --git a/tgstation.dme b/tgstation.dme index 11399a1b14..cfe9e0d0c5 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -224,9 +224,9 @@ #include "code\controllers\configuration\config_entry.dm" #include "code\controllers\configuration\configuration.dm" #include "code\controllers\configuration\entries\comms.dm" -#include "code\controllers\configuration\entries\config.dm" #include "code\controllers\configuration\entries\dbconfig.dm" #include "code\controllers\configuration\entries\game_options.dm" +#include "code\controllers\configuration\entries\general.dm" #include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\assets.dm" From f875d4e17659762ac01a32b239c8e200088d7af8 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Sun, 17 Dec 2017 11:02:11 -0500 Subject: [PATCH 03/97] Defines math, take 2 --- code/__DEFINES/atmospherics.dm | 6 + code/__DEFINES/math.dm | 27 -- code/__DEFINES/maths.dm | 209 +++++++++++ code/__HELPERS/_lists.dm | 4 +- code/__HELPERS/maths.dm | 257 ------------- code/__HELPERS/radio.dm | 17 + code/__HELPERS/time.dm | 6 +- code/__HELPERS/type2type.dm | 2 +- code/__HELPERS/unsorted.dm | 18 +- code/_onclick/hud/parallax.dm | 4 +- code/_onclick/hud/robot.dm | 280 ++++++++++++++ code/_onclick/item_attack.dm | 4 +- .../controllers/configuration/config_entry.dm | 2 +- code/controllers/master.dm | 2 +- code/controllers/subsystem/throwing.dm | 2 +- code/datums/beam.dm | 4 +- code/datums/components/archaeology.dm | 2 +- code/datums/components/decal.dm | 2 +- code/datums/dash_weapon.dm | 2 +- code/datums/diseases/advance/advance.dm | 8 +- code/datums/explosion.dm | 2 +- code/datums/martial/krav_maga.dm | 4 +- code/datums/progressbar.dm | 2 +- code/datums/radiation_wave.dm | 4 +- code/datums/status_effects/buffs.dm | 6 +- code/datums/status_effects/debuffs.dm | 4 +- code/game/gamemodes/blob/blobs/blob_mobs.dm | 2 +- code/game/gamemodes/blob/overmind.dm | 2 +- .../clock_cult/clock_effects/clock_sigils.dm | 2 +- .../clock_helpers/fabrication_helpers.dm | 4 +- .../scripture_applications.dm | 2 +- .../clock_structures/mania_motor.dm | 2 +- .../clock_structures/taunting_trail.dm | 2 +- code/game/gamemodes/meteor/meteor.dm | 2 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 +- code/game/machinery/computer/apc_control.dm | 4 +- code/game/machinery/computer/atmos_control.dm | 2 +- code/game/machinery/computer/dna_console.dm | 33 +- .../machinery/computer/gulag_teleporter.dm | 2 +- .../machinery/computer/telecrystalconsoles.dm | 6 + code/game/machinery/deployable.dm | 2 +- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 4 +- code/game/machinery/shieldgen.dm | 2 +- code/game/machinery/spaceheater.dm | 4 +- code/game/machinery/syndicatebomb.dm | 2 +- code/game/machinery/vending.dm | 2 +- code/game/mecha/mech_fabricator.dm | 6 +- code/game/mecha/working/ripley.dm | 2 +- code/game/objects/effects/anomalies.dm | 5 + code/game/objects/items/chrono_eraser.dm | 2 +- code/game/objects/items/defib.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 2 +- .../objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/dice.dm | 2 +- code/game/objects/items/grenades/plastic.dm | 4 +- code/game/objects/items/his_grace.dm | 6 +- code/game/objects/items/pneumaticCannon.dm | 4 +- code/game/objects/items/robot/robot_items.dm | 4 +- code/game/objects/items/sharpener.dm | 6 +- code/game/objects/items/stacks/stack.dm | 4 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 347 ++++++++++++++++++ code/game/objects/obj_defense.dm | 2 +- code/game/objects/structures/fireplace.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/lattice.dm | 4 +- code/game/objects/structures/musician.dm | 2 +- code/game/objects/structures/reflector.dm | 33 +- code/game/objects/structures/tables_racks.dm | 4 +- code/game/objects/structures/window.dm | 2 +- .../turfs/simulated/floor/plating/asteroid.dm | 2 +- code/game/turfs/simulated/walls.dm | 2 +- code/modules/admin/sound_emitter.dm | 4 +- code/modules/admin/sql_message_system.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/playsound.dm | 2 +- .../components/binary_devices/dp_vent_pump.dm | 6 +- .../components/binary_devices/passive_gate.dm | 4 +- .../components/binary_devices/pump.dm | 7 +- .../components/binary_devices/volume_pump.dm | 7 +- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 2 +- .../unary_devices/outlet_injector.dm | 4 +- .../components/unary_devices/thermomachine.dm | 2 +- .../components/unary_devices/vent_pump.dm | 8 +- .../machinery/pipes/layermanifold.dm | 4 +- .../machinery/portable/canister.dm | 4 +- .../atmospherics/machinery/portable/pump.dm | 2 +- code/modules/cargo/exports.dm | 6 +- code/modules/client/client_procs.dm | 12 +- code/modules/client/preferences.dm | 4 +- .../modules/clothing/spacesuits/flightsuit.dm | 20 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- code/modules/events/_event.dm | 4 +- code/modules/events/brand_intelligence.dm | 4 +- code/modules/events/disease_outbreak.dm | 9 + code/modules/events/meteor_wave.dm | 2 +- code/modules/events/portal_storm.dm | 6 +- .../kitchen_machinery/food_cart.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- code/modules/goonchat/browserOutput.dm | 2 +- code/modules/hydroponics/gene_modder.dm | 2 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/grown/towercap.dm | 4 +- code/modules/hydroponics/growninedible.dm | 2 +- code/modules/hydroponics/hydroponics.dm | 12 +- code/modules/hydroponics/seeds.dm | 28 +- .../core/special_pins/index_pin.dm | 2 +- .../subtypes/converters.dm | 4 +- .../subtypes/data_transfer.dm | 2 +- .../integrated_electronics/subtypes/input.dm | 4 +- .../subtypes/manipulation.dm | 12 +- .../integrated_electronics/subtypes/output.dm | 4 +- .../subtypes/reagents.dm | 8 +- .../integrated_electronics/subtypes/time.dm | 2 +- .../integrated_electronics/subtypes/trig.dm | 8 +- code/modules/language/language.dm | 2 +- code/modules/library/lib_machines.dm | 4 +- code/modules/lighting/lighting_source.dm | 4 +- code/modules/mapping/reader.dm | 10 +- .../mining/lavaland/necropolis_chests.dm | 4 +- code/modules/mining/machine_redemption.dm | 2 +- code/modules/mining/mint.dm | 2 +- .../modules/mob/dead/new_player/new_player.dm | 4 +- code/modules/mob/dead/observer/observer.dm | 2 +- code/modules/mob/living/brain/brain_item.dm | 2 +- .../mob/living/carbon/alien/status_procs.dm | 2 +- .../modules/mob/living/carbon/damage_procs.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 6 +- .../carbon/human/species_types/golems.dm | 2 +- .../carbon/human/species_types/vampire.dm | 4 +- code/modules/mob/living/carbon/life.dm | 2 +- .../modules/mob/living/carbon/status_procs.dm | 4 +- code/modules/mob/living/damage_procs.dm | 10 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defense.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 6 +- .../mob/living/silicon/pai/pai_defense.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 2 +- .../mob/living/simple_animal/damage_procs.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 4 +- .../hostile/megafauna/colossus.dm | 2 +- .../simple_animal/hostile/megafauna/dragon.dm | 6 +- .../hostile/megafauna/hierophant.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/powers.dm | 2 +- code/modules/power/apc.dm | 4 +- code/modules/power/cell.dm | 4 +- code/modules/power/powernet.dm | 2 +- code/modules/power/smes.dm | 6 +- code/modules/power/solar.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 10 +- code/modules/power/tesla/energy_ball.dm | 4 +- .../boxes_magazines/external_mag.dm | 2 +- .../projectiles/guns/ballistic/automatic.dm | 8 +- code/modules/projectiles/guns/beam_rifle.dm | 6 +- code/modules/projectiles/guns/energy.dm | 2 +- code/modules/projectiles/guns/magic/wand.dm | 4 +- code/modules/projectiles/projectile.dm | 12 +- code/modules/reagents/chemistry/holder.dm | 2 +- .../chemistry/machinery/chem_dispenser.dm | 2 +- .../chemistry/machinery/chem_heater.dm | 2 +- .../chemistry/machinery/chem_master.dm | 4 +- .../chemistry/machinery/reagentgrinder.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 2 +- .../chemistry/reagents/toxin_reagents.dm | 4 +- .../chemistry/recipes/pyrotechnics.dm | 8 +- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/recycling/disposal/bin.dm | 2 +- code/modules/research/protolathe.dm | 2 +- .../research/xenobiology/xenobiology.dm | 4 +- code/modules/shuttle/shuttle.dm | 14 +- code/modules/spells/spell_types/wizard.dm | 2 +- .../surgery/bodyparts/dismemberment.dm | 2 +- code/modules/surgery/organs/eyes.dm | 2 +- code/modules/surgery/organs/lungs.dm | 6 +- tgstation.dme | 3 +- 180 files changed, 1250 insertions(+), 644 deletions(-) delete mode 100644 code/__DEFINES/math.dm create mode 100644 code/__DEFINES/maths.dm delete mode 100644 code/__HELPERS/maths.dm diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index dacd09c995..20d80cb904 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -12,6 +12,12 @@ //ATMOS //stuff you should probably leave well alone! +#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) +#define ONE_ATMOSPHERE 101.325 //kPa +#define T0C 273.15 // 0degC +#define T20C 293.15 // 20degC +#define TCMB 2.7 // -270.3degC + #define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC #define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) //compared against for superconductivity #define O2STANDARD 0.21 //percentage of oxygen in a normal mixture of air diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm deleted file mode 100644 index 5b3f51b4e3..0000000000 --- a/code/__DEFINES/math.dm +++ /dev/null @@ -1,27 +0,0 @@ -#define PI 3.1415 -#define SPEED_OF_LIGHT 3e8 //not exact but hey! -#define SPEED_OF_LIGHT_SQ 9e+16 -#define INFINITY 1e31 //closer then enough - -//atmos -#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) -#define ONE_ATMOSPHERE 101.325 //kPa -#define T0C 273.15 // 0degC -#define T20C 293.15 // 20degC -#define TCMB 2.7 // -270.3degC - -#define SHORT_REAL_LIMIT 16777216 - -//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks -//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio) -//collapsed to percent_of_tick_used * tick_lag -#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag) -#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage)) - -#define PERCENT(val) (round(val*100, 0.1)) -#define CLAMP01(x) (Clamp(x, 0, 1)) - -//time of day but automatically adjusts to the server going into the next day within the same round. -//for when you need a reliable time number that doesn't depend on byond time. -#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK)) -#define MIDNIGHT_ROLLOVER_CHECK ( GLOB.rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : GLOB.midnight_rollovers ) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm new file mode 100644 index 0000000000..0ff3ade369 --- /dev/null +++ b/code/__DEFINES/maths.dm @@ -0,0 +1,209 @@ +// Credits to Nickr5 for the useful procs I've taken from his library resource. +// This file is quadruple wrapped for your pleasure +// ( + +#define NUM_E 2.71828183 +#define NUM_SQRT2 1.41421356 + +#define PI 3.1415 +#define SPEED_OF_LIGHT 3e8 //not exact but hey! +#define SPEED_OF_LIGHT_SQ 9e+16 +#define INFINITY 1e31 //closer then enough + +#define SHORT_REAL_LIMIT 16777216 + +//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks +//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio) +//collapsed to percent_of_tick_used * tick_lag +#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag) +#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE_REAL - starting_tickusage)) + +#define PERCENT(val) (round((val)*100, 0.1)) +#define CLAMP01(x) (CLAMP(x, 0, 1)) + +//time of day but automatically adjusts to the server going into the next day within the same round. +//for when you need a reliable time number that doesn't depend on byond time. +#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK)) +#define MIDNIGHT_ROLLOVER_CHECK ( GLOB.rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : GLOB.midnight_rollovers ) + +#define SIGN(x) ( (x)!=0 ? (x) / abs(x) : 0 ) + +#define CEILING(x, y) ( -round(-(x) / (y)) * (y) ) + +// round() acts like floor(x, 1) by default but can't handle other values +#define FLOOR(x, y) ( round((x) / (y)) * (y) ) + +#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) + +// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive +#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ) + +// Real modulus that handles decimals +#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) + +// Tangent +#define TAN(x) (sin(x) / cos(x)) + +// Cotangent +#define COT(x) (1 / TAN(x)) + +// Secant +#define SEC(x) (1 / cos(x)) + +// Cosecant +#define CSC(x) (1 / sin(x)) + +#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) + +// Greatest Common Divisor - Euclid's algorithm +/proc/Gcd(a, b) + return b ? Gcd(b, (a) % (b)) : a + +// Least Common Multiple +#define Lcm(a, b) (abs(a) / Gcd(a, b) * abs(b)) + +#define INVERSE(x) ( 1/(x) ) + +// Used for calculating the radioactive strength falloff +#define INVERSE_SQUARE(initial_strength,cur_distance,initial_distance) ( (initial_strength)*((initial_distance)**2/(cur_distance)**2) ) + +#define ISABOUTEQUAL(a, b, deviation) (deviation ? abs((a) - (b)) <= deviation : abs((a) - (b)) <= 0.1) + +#define ISEVEN(x) (x % 2 == 0) + +#define ISODD(x) (x % 2 != 0) + +// Returns true if val is from min to max, inclusive. +#define ISINRANGE(val, min, max) (min <= val && val <= max) + +// Same as above, exclusive. +#define ISINRANGE_EX(val, min, max) (min < val && val > max) + +#define ISINTEGER(x) (round(x) == x) + +#define ISMULTIPLE(x, y) ((x) % (y) == 0) + +// Performs a linear interpolation between a and b. +// Note that amount=0 returns a, amount=1 returns b, and +// amount=0.5 returns the mean of a and b. +#define LERP(a, b, amount) (amount ? ((a) + ((b) - (a)) * (amount)) : ((a) + ((b) - (a)) * 0.5) + +// Returns the nth root of x. +#define ROOT(n, x) ((x) ** (1 / (n))) + +// The quadratic formula. Returns a list with the solutions, or an empty list +// if they are imaginary. +/proc/SolveQuadratic(a, b, c) + ASSERT(a) + . = list() + var/d = b*b - 4 * a * c + var/bottom = 2 * a + if(d < 0) + return + var/root = sqrt(d) + . += (-b + root) / bottom + if(!d) + return + . += (-b - root) / bottom + +#define TODEGREES(radians) ((radians) * 57.2957795) + +#define TORADIANS(degrees) ((degrees) * 0.0174532925) + +// Will filter out extra rotations and negative rotations +// E.g: 540 becomes 180. -180 becomes 180. +#define SIMPLIFY_DEGREES(degrees) (MODULUS((degrees), 360)) + +#define GET_ANGLE_OF_INCIDENCE(face, input) (MODULUS((face) - (input), 360)) + +//A logarithm that converts an integer to a number scaled between 0 and 1. +//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions. +#define TRANSFORM_USING_VARIABLE(input, max) ( sin((90*(input))/(max))**2 ) + +//converts a uniform distributed random number into a normal distributed one +//since this method produces two random numbers, one is saved for subsequent calls +//(making the cost negligble for every second call) +//This will return +/- decimals, situated about mean with standard deviation stddev +//68% chance that the number is within 1stddev +//95% chance that the number is within 2stddev +//98% chance that the number is within 3stddev...etc +#define ACCURACY 10000 +/proc/gaussian(mean, stddev) + var/static/gaussian_next + var/R1;var/R2;var/working + if(gaussian_next != null) + R1 = gaussian_next + gaussian_next = null + else + do + R1 = rand(-ACCURACY,ACCURACY)/ACCURACY + R2 = rand(-ACCURACY,ACCURACY)/ACCURACY + working = R1*R1 + R2*R2 + while(working >= 1 || working==0) + working = sqrt(-2 * log(working) / working) + R1 *= working + gaussian_next = R2 * working + return (mean + stddev * R1) +#undef ACCURACY + +/proc/mouse_angle_from_client(client/client) + var/list/mouse_control = params2list(client.mouseParams) + if(mouse_control["screen-loc"] && client) + var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") + var/list/screen_loc_X = splittext(screen_loc_params[1],":") + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") + var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) + var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) + var/list/screenview = getviewsize(client.view) + var/screenviewX = screenview[1] * world.icon_size + var/screenviewY = screenview[2] * world.icon_size + var/ox = round(screenviewX/2) - client.pixel_x //"origin" x + var/oy = round(screenviewY/2) - client.pixel_y //"origin" y + var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) + return angle + +/proc/get_turf_in_angle(angle, turf/starting, increments) + var/pixel_x = 0 + var/pixel_y = 0 + for(var/i in 1 to increments) + pixel_x += sin(angle)+16*sin(angle)*2 + pixel_y += cos(angle)+16*cos(angle)*2 + var/new_x = starting.x + var/new_y = starting.y + while(pixel_x > 16) + pixel_x -= 32 + new_x++ + while(pixel_x < -16) + pixel_x += 32 + new_x-- + while(pixel_y > 16) + pixel_y -= 32 + new_y++ + while(pixel_y < -16) + pixel_y += 32 + new_y-- + new_x = CLAMP(new_x, 0, world.maxx) + new_y = CLAMP(new_y, 0, world.maxy) + return locate(new_x, new_y, starting.z) + +// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles +/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4) + var/list/region_x1 = list() + var/list/region_y1 = list() + var/list/region_x2 = list() + var/list/region_y2 = list() + + // These loops create loops filled with x/y values that the boundaries inhabit + // ex: list(5, 6, 7, 8, 9) + for(var/i in min(x1, x2) to max(x1, x2)) + region_x1["[i]"] = TRUE + for(var/i in min(y1, y2) to max(y1, y2)) + region_y1["[i]"] = TRUE + for(var/i in min(x3, x4) to max(x3, x4)) + region_x2["[i]"] = TRUE + for(var/i in min(y3, y4) to max(y3, y4)) + region_y2["[i]"] = TRUE + + return list(region_x1 & region_x2, region_y1 & region_y2) + +// ) \ No newline at end of file diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 631214de98..91eee45b4d 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -43,8 +43,8 @@ //Returns list element or null. Should prevent "index out of bounds" error. /proc/listgetindex(list/L, index) if(LAZYLEN(L)) - if(isnum(index) && IsInteger(index)) - if(IsInRange(index,1,L.len)) + if(isnum(index) && ISINTEGER(index)) + if(ISINRANGE(index,1,L.len)) return L[index] else if(index in L) return L[index] diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm deleted file mode 100644 index 0af8b8ae1a..0000000000 --- a/code/__HELPERS/maths.dm +++ /dev/null @@ -1,257 +0,0 @@ -// Credits to Nickr5 for the useful procs I've taken from his library resource. - -GLOBAL_VAR_INIT(E, 2.71828183) -GLOBAL_VAR_INIT(Sqrt2, 1.41421356) - -// List of square roots for the numbers 1-100. -GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10)) - -/proc/sign(x) - return x!=0?x/abs(x):0 - -/proc/Atan2(x, y) - if(!x && !y) - return 0 - var/a = arccos(x / sqrt(x*x + y*y)) - return y >= 0 ? a : -a - -/proc/Ceiling(x, y=1) - return -round(-x / y) * y - -/proc/Floor(x, y=1) - return round(x / y) * y - -#define Clamp(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) - -/proc/Modulus(x, y) //Byond's modulus doesn't work with decimals. - return x - y * round(x / y) - -// cotangent -/proc/Cot(x) - return 1 / Tan(x) - -// cosecant -/proc/Csc(x) - return 1 / sin(x) - -/proc/Default(a, b) - return a ? a : b - -// Greatest Common Divisor - Euclid's algorithm -/proc/Gcd(a, b) - return b ? Gcd(b, a % b) : a - -/proc/Inverse(x) - return 1 / x - -#define InverseSquareLaw(initial_strength,cur_distance,initial_distance) (initial_strength*(initial_distance**2/cur_distance**2)) - -/proc/IsAboutEqual(a, b, deviation = 0.1) - return abs(a - b) <= deviation - -/proc/IsEven(x) - return x % 2 == 0 - -// Returns true if val is from min to max, inclusive. -/proc/IsInRange(val, min, max) - return min <= val && val <= max - -/proc/IsInteger(x) - return round(x) == x - -/proc/IsOdd(x) - return !IsEven(x) - -/proc/IsMultiple(x, y) - return x % y == 0 - -// Least Common Multiple -/proc/Lcm(a, b) - return abs(a) / Gcd(a, b) * abs(b) - -// Performs a linear interpolation between a and b. -// Note that amount=0 returns a, amount=1 returns b, and -// amount=0.5 returns the mean of a and b. -/proc/Lerp(a, b, amount = 0.5) - return a + (b - a) * amount - -//Calculates the sum of a list of numbers. -/proc/Sum(var/list/data) - . = 0 - for(var/val in data) - .+= val - -//Calculates the mean of a list of numbers. -/proc/Mean(var/list/data) - . = Sum(data) / (data.len) - - -// Returns the nth root of x. -/proc/Root(n, x) - return x ** (1 / n) - -// secant -/proc/Sec(x) - return 1 / cos(x) - -// The quadratic formula. Returns a list with the solutions, or an empty list -// if they are imaginary. -/proc/SolveQuadratic(a, b, c) - ASSERT(a) - . = list() - var/d = b*b - 4 * a * c - var/bottom = 2 * a - if(d < 0) - return - var/root = sqrt(d) - . += (-b + root) / bottom - if(!d) - return - . += (-b - root) / bottom - -// tangent -/proc/Tan(x) - return sin(x) / cos(x) - -/proc/ToDegrees(radians) - // 180 / Pi - return radians * 57.2957795 - -/proc/ToRadians(degrees) - // Pi / 180 - return degrees * 0.0174532925 - -// Will filter out extra rotations and negative rotations -// E.g: 540 becomes 180. -180 becomes 180. -/proc/SimplifyDegrees(degrees) - degrees = degrees % 360 - if(degrees < 0) - degrees += 360 - return degrees - -// min is inclusive, max is exclusive -/proc/Wrap(val, min, max) - var/d = max - min - var/t = round((val - min) / d) - return val - (t * d) - -#define NORM_ROT(rot) ((((rot % 360) + (rot - round(rot, 1))) >= 0) ? ((rot % 360) + (rot - round(rot, 1))) : (((rot % 360) + (rot - round(rot, 1))) + 360)) - -/proc/get_angle_of_incidence(face_angle, angle_in, auto_normalize = TRUE) - - var/angle_in_s = NORM_ROT(angle_in) - var/face_angle_s = NORM_ROT(face_angle) - var/incidence = face_angle_s - angle_in_s - var/incidence_s = incidence - while(incidence_s < -90) - incidence_s += 180 - while(incidence_s > 90) - incidence_s -= 180 - if(auto_normalize) - return incidence_s - else - return incidence - -//A logarithm that converts an integer to a number scaled between 0 and 1 (can be tweaked to be higher). -//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions. -/proc/TransformUsingVariable(input, inputmaximum, scaling_modifier = 0) - - var/inputToDegrees = (input/inputmaximum)*180 //Converting from a 0 -> 100 scale to a 0 -> 180 scale. The 0 -> 180 scale corresponds to degrees - var/size_factor = ((-cos(inputToDegrees) +1) /2) //returns a value from 0 to 1 - - return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5 - -//converts a uniform distributed random number into a normal distributed one -//since this method produces two random numbers, one is saved for subsequent calls -//(making the cost negligble for every second call) -//This will return +/- decimals, situated about mean with standard deviation stddev -//68% chance that the number is within 1stddev -//95% chance that the number is within 2stddev -//98% chance that the number is within 3stddev...etc -#define ACCURACY 10000 -/proc/gaussian(mean, stddev) - var/static/gaussian_next - var/R1;var/R2;var/working - if(gaussian_next != null) - R1 = gaussian_next - gaussian_next = null - else - do - R1 = rand(-ACCURACY,ACCURACY)/ACCURACY - R2 = rand(-ACCURACY,ACCURACY)/ACCURACY - working = R1*R1 + R2*R2 - while(working >= 1 || working==0) - working = sqrt(-2 * log(working) / working) - R1 *= working - gaussian_next = R2 * working - return (mean + stddev * R1) -#undef ACCURACY - -/proc/mouse_angle_from_client(client/client) - var/list/mouse_control = params2list(client.mouseParams) - if(mouse_control["screen-loc"] && client) - var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") - var/list/screen_loc_X = splittext(screen_loc_params[1],":") - var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) - var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) - var/list/screenview = getviewsize(client.view) - var/screenviewX = screenview[1] * world.icon_size - var/screenviewY = screenview[2] * world.icon_size - var/ox = round(screenviewX/2) - client.pixel_x //"origin" x - var/oy = round(screenviewY/2) - client.pixel_y //"origin" y - var/angle = NORM_ROT(Atan2(y - oy, x - ox)) - return angle - -/proc/get_turf_in_angle(angle, turf/starting, increments) - var/pixel_x = 0 - var/pixel_y = 0 - for(var/i in 1 to increments) - pixel_x += sin(angle)+16*sin(angle)*2 - pixel_y += cos(angle)+16*cos(angle)*2 - var/new_x = starting.x - var/new_y = starting.y - while(pixel_x > 16) - pixel_x -= 32 - new_x++ - while(pixel_x < -16) - pixel_x += 32 - new_x-- - while(pixel_y > 16) - pixel_y -= 32 - new_y++ - while(pixel_y < -16) - pixel_y += 32 - new_y-- - new_x = Clamp(new_x, 0, world.maxx) - new_y = Clamp(new_y, 0, world.maxy) - return locate(new_x, new_y, starting.z) - -/proc/round_down(num) - if(round(num) != num) - return round(num--) - else return num - -//proc/get_overlap() -// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles -/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4) - var/list/region_x1 = list() - var/list/region_y1 = list() - var/list/region_x2 = list() - var/list/region_y2 = list() - - // These loops create loops filled with x/y values that the boundaries inhabit - // ex: list(5, 6, 7, 8, 9) - for(var/i in min(x1, x2) to max(x1, x2)) - region_x1["[i]"] = TRUE - for(var/i in min(y1, y2) to max(y1, y2)) - region_y1["[i]"] = TRUE - for(var/i in min(x3, x4) to max(x3, x4)) - region_x2["[i]"] = TRUE - for(var/i in min(y3, y4) to max(y3, y4)) - region_y2["[i]"] = TRUE - - return list(region_x1 & region_x2, region_y1 & region_y2) \ No newline at end of file diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 1706e8658c..56471142ca 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD // Ensure the frequency is within bounds of what it should be sending/recieving at /proc/sanitize_frequency(frequency, free = FALSE) . = round(frequency) @@ -12,3 +13,19 @@ /proc/format_frequency(frequency) frequency = text2num(frequency) return "[round(frequency / 10)].[frequency % 10]" +======= +// Ensure the frequency is within bounds of what it should be sending/recieving at +/proc/sanitize_frequency(frequency, free = FALSE) + . = round(frequency) + if(free) + . = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) + else + . = CLAMP(frequency, MIN_FREQ, MAX_FREQ) + if(!(. % 2)) // Ensure the last digit is an odd number + . += 1 + +// Format frequency by moving the decimal. +/proc/format_frequency(frequency) + frequency = text2num(frequency) + return "[round(frequency / 10)].[frequency % 10]" +>>>>>>> 25080ff... defines math (#33498) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 74c565da52..68ab173ecd 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -60,7 +60,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(!second) return "0 seconds" if(second >= 60) - minute = round_down(second/60) + minute = FLOOR(second/60, 1) second = round(second - (minute*60), 0.1) second_rounded = TRUE if(second) //check if we still have seconds remaining to format, or if everything went into minute. @@ -91,7 +91,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(!minute) return "[second]" if(minute >= 60) - hour = round_down(minute/60,1) + hour = FLOOR(minute/60, 1) minute = (minute - (hour*60)) if(minute) //alot simpler from here since you don't have to worry about fractions if(minute != 1) @@ -114,7 +114,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(!hour) return "[minute][second]" if(hour >= 24) - day = round_down(hour/24,1) + day = FLOOR(hour/24, 1) hour = (hour - (day*24)) if(hour) if(hour != 1) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index bae773b27e..2ebe24b85b 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -117,7 +117,7 @@ //Converts an angle (degrees) into an ss13 direction /proc/angle2dir(degree) - degree = SimplifyDegrees(degree) + degree = SIMPLIFY_DEGREES(degree) switch(degree) if(0 to 22.5) //north requires two angle ranges return NORTH diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 9ec23fa966..207e69fa9b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -147,10 +147,10 @@ Turf and target are separate in case you want to teleport some distance from a t var/line[] = list(locate(px,py,M.z)) var/dx=N.x-px //x distance var/dy=N.y-py - var/dxabs=abs(dx)//Absolute value of x distance - var/dyabs=abs(dy) - var/sdx=sign(dx) //Sign of x distance (+ or -) - var/sdy=sign(dy) + var/dxabs = abs(dx)//Absolute value of x distance + var/dyabs = abs(dy) + var/sdx = SIGN(dx) //Sign of x distance (+ or -) + var/sdy = SIGN(dy) var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. var/j //Generic integer for counting @@ -953,8 +953,8 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( tY = tY[1] tX = splittext(tX[1], ":") tX = tX[1] - tX = Clamp(origin.x + text2num(tX) - world.view - 1, 1, world.maxx) - tY = Clamp(origin.y + text2num(tY) - world.view - 1, 1, world.maxy) + tX = CLAMP(origin.x + text2num(tX) - world.view - 1, 1, world.maxx) + tY = CLAMP(origin.y + text2num(tY) - world.view - 1, 1, world.maxy) return locate(tX, tY, tZ) /proc/screen_loc2turf(text, turf/origin) @@ -966,8 +966,8 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( tX = splittext(tZ[2], "-") tX = text2num(tX[2]) tZ = origin.z - tX = Clamp(origin.x + 7 - tX, 1, world.maxx) - tY = Clamp(origin.y + 7 - tY, 1, world.maxy) + tX = CLAMP(origin.x + 7 - tX, 1, world.maxx) + tY = CLAMP(origin.y + 7 - tY, 1, world.maxy) return locate(tX, tY, tZ) /proc/IsValidSrc(datum/D) @@ -1272,7 +1272,7 @@ proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) . = 0 var/i = DS2TICKS(initial_delay) do - . += Ceiling(i*DELTA_CALC) + . += CEILING(i*DELTA_CALC, 1) sleep(i*world.tick_lag*DELTA_CALC) i *= 2 while (TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index ff38107bfb..52319b7866 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -257,8 +257,8 @@ view = world.view var/list/viewscales = getviewsize(view) - var/countx = Ceiling((viewscales[1]/2)/(480/world.icon_size))+1 - var/county = Ceiling((viewscales[2]/2)/(480/world.icon_size))+1 + var/countx = CEILING((viewscales[1]/2)/(480/world.icon_size), 1)+1 + var/county = CEILING((viewscales[2]/2)/(480/world.icon_size), 1)+1 var/list/new_overlays = new for(var/x in -countx to countx) for(var/y in -county to county) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index f1ec409520..e227968f57 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/screen/robot icon = 'icons/mob/screen_cyborg.dmi' @@ -275,3 +276,282 @@ else for(var/obj/item/I in R.held_items) screenmob.client.screen -= I +======= +/obj/screen/robot + icon = 'icons/mob/screen_cyborg.dmi' + +/obj/screen/robot/module + name = "cyborg module" + icon_state = "nomod" + +/obj/screen/robot/Click() + if(isobserver(usr)) + return 1 + +/obj/screen/robot/module/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + if(R.module.type != /obj/item/robot_module) + R.hud_used.toggle_show_robot_modules() + return 1 + R.pick_module() + +/obj/screen/robot/module1 + name = "module1" + icon_state = "inv1" + +/obj/screen/robot/module1/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_module(1) + +/obj/screen/robot/module2 + name = "module2" + icon_state = "inv2" + +/obj/screen/robot/module2/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_module(2) + +/obj/screen/robot/module3 + name = "module3" + icon_state = "inv3" + +/obj/screen/robot/module3/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_module(3) + +/obj/screen/robot/radio + name = "radio" + icon_state = "radio" + +/obj/screen/robot/radio/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.radio.interact(R) + +/obj/screen/robot/store + name = "store" + icon_state = "store" + +/obj/screen/robot/store/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.uneq_active() + +/obj/screen/robot/lamp + name = "headlamp" + icon_state = "lamp0" + +/obj/screen/robot/lamp/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.control_headlamp() + +/obj/screen/robot/thrusters + name = "ion thrusters" + icon_state = "ionpulse0" + +/obj/screen/robot/thrusters/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_ionpulse() + +/datum/hud/robot + ui_style_icon = 'icons/mob/screen_cyborg.dmi' + +/datum/hud/robot/New(mob/owner, ui_style = 'icons/mob/screen_cyborg.dmi') + ..() + var/mob/living/silicon/robot/mymobR = mymob + var/obj/screen/using + + using = new/obj/screen/language_menu + using.screen_loc = ui_borg_language_menu + static_inventory += using + +//Radio + using = new /obj/screen/robot/radio() + using.screen_loc = ui_borg_radio + static_inventory += using + +//Module select + using = new /obj/screen/robot/module1() + using.screen_loc = ui_inv1 + static_inventory += using + mymobR.inv1 = using + + using = new /obj/screen/robot/module2() + using.screen_loc = ui_inv2 + static_inventory += using + mymobR.inv2 = using + + using = new /obj/screen/robot/module3() + using.screen_loc = ui_inv3 + static_inventory += using + mymobR.inv3 = using + +//End of module select + +//Photography stuff + using = new /obj/screen/ai/image_take() + using.screen_loc = ui_borg_camera + static_inventory += using + + using = new /obj/screen/ai/image_view() + using.screen_loc = ui_borg_album + static_inventory += using + +//Sec/Med HUDs + using = new /obj/screen/ai/sensors() + using.screen_loc = ui_borg_sensor + static_inventory += using + +//Headlamp control + using = new /obj/screen/robot/lamp() + using.screen_loc = ui_borg_lamp + static_inventory += using + mymobR.lamp_button = using + +//Thrusters + using = new /obj/screen/robot/thrusters() + using.screen_loc = ui_borg_thrusters + static_inventory += using + mymobR.thruster_button = using + +//Intent + action_intent = new /obj/screen/act_intent/robot() + action_intent.icon_state = mymob.a_intent + static_inventory += action_intent + +//Health + healths = new /obj/screen/healths/robot() + infodisplay += healths + +//Installed Module + mymobR.hands = new /obj/screen/robot/module() + mymobR.hands.screen_loc = ui_borg_module + static_inventory += mymobR.hands + +//Store + module_store_icon = new /obj/screen/robot/store() + module_store_icon.screen_loc = ui_borg_store + + pull_icon = new /obj/screen/pull() + pull_icon.icon = 'icons/mob/screen_cyborg.dmi' + pull_icon.update_icon(mymob) + pull_icon.screen_loc = ui_borg_pull + hotkeybuttons += pull_icon + + + zone_select = new /obj/screen/zone_sel/robot() + zone_select.update_icon(mymob) + static_inventory += zone_select + + +/datum/hud/proc/toggle_show_robot_modules() + if(!iscyborg(mymob)) + return + + var/mob/living/silicon/robot/R = mymob + + R.shown_robot_modules = !R.shown_robot_modules + update_robot_modules_display() + +/datum/hud/proc/update_robot_modules_display(mob/viewer) + if(!iscyborg(mymob)) + return + + var/mob/living/silicon/robot/R = mymob + + var/mob/screenmob = viewer || R + + if(!R.module) + return + + if(!R.client) + return + + if(R.shown_robot_modules && screenmob.hud_used.hud_shown) + //Modules display is shown + screenmob.client.screen += module_store_icon //"store" icon + + if(!R.module.modules) + to_chat(usr, "Selected module has no modules to select") + return + + if(!R.robot_modules_background) + return + + var/display_rows = CEILING(length(R.module.get_inactive_modules()) / 8, 1) + R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" + screenmob.client.screen += R.robot_modules_background + + var/x = -4 //Start at CENTER-4,SOUTH+1 + var/y = 1 + + for(var/atom/movable/A in R.module.get_inactive_modules()) + //Module is not currently active + screenmob.client.screen += A + if(x < 0) + A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" + else + A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" + A.layer = ABOVE_HUD_LAYER + A.plane = ABOVE_HUD_PLANE + + x++ + if(x == 4) + x = -4 + y++ + + else + //Modules display is hidden + screenmob.client.screen -= module_store_icon //"store" icon + + for(var/atom/A in R.module.get_inactive_modules()) + //Module is not currently active + screenmob.client.screen -= A + R.shown_robot_modules = 0 + screenmob.client.screen -= R.robot_modules_background + +/mob/living/silicon/robot/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/robot(src) + + +/datum/hud/robot/persistent_inventory_update(mob/viewer) + if(!mymob) + return + var/mob/living/silicon/robot/R = mymob + + var/mob/screenmob = viewer || R + + if(screenmob.hud_used) + if(screenmob.hud_used.hud_shown) + for(var/i in 1 to R.held_items.len) + var/obj/item/I = R.held_items[i] + if(I) + switch(i) + if(1) + I.screen_loc = ui_inv1 + if(2) + I.screen_loc = ui_inv2 + if(3) + I.screen_loc = ui_inv3 + else + return + screenmob.client.screen += I + else + for(var/obj/item/I in R.held_items) + screenmob.client.screen -= I +>>>>>>> 25080ff... defines math (#33498) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 859c957a43..727e149a97 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -119,9 +119,9 @@ /obj/item/proc/get_clamped_volume() if(w_class) if(force) - return Clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 + return CLAMP((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 else - return Clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 + return CLAMP(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 /mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area) var/message_verb = "attacked" diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 92dcb9baf0..804060aaa8 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -110,7 +110,7 @@ /datum/config_entry/number/ValidateAndSet(str_val) var/temp = text2num(trim(str_val)) if(!isnull(temp)) - value = Clamp(integer ? round(temp) : temp, min_val, max_val) + value = CLAMP(integer ? round(temp) : temp, min_val, max_val) if(value != temp && !var_edited) log_config("Changing [name] from [temp] to [value]!") return TRUE diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 568257e10f..b9950da7b9 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -301,7 +301,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new continue //Byond resumed us late. assume it might have to do the same next tick - if (last_run + Ceiling(world.tick_lag * (processing * sleep_delta), world.tick_lag) < world.time) + if (last_run + CEILING(world.tick_lag * (processing * sleep_delta), world.tick_lag) < world.time) sleep_delta += 1 sleep_delta = MC_AVERAGE_FAST(sleep_delta, 1) //decay sleep_delta diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 97d84a0d3b..ec21f3bab2 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -80,7 +80,7 @@ SUBSYSTEM_DEF(throwing) last_move = world.time //calculate how many tiles to move, making up for any missed ticks. - var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time + delayed_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait)) + var/tilestomove = CEILING(min(((((world.time+world.tick_lag) - start_time + delayed_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait), 1) while (tilestomove-- > 0) if ((dist_travelled >= maxrange || AM.loc == target_turf) && AM.has_gravity(AM.loc)) finalize() diff --git a/code/datums/beam.dm b/code/datums/beam.dm index c1a75c8b7e..dc68de933a 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -128,11 +128,11 @@ //Position the effect so the beam is one continous line var/a if(abs(Pixel_x)>32) - a = Pixel_x > 0 ? round(Pixel_x/32) : Ceiling(Pixel_x/32) + a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) X.x += a Pixel_x %= 32 if(abs(Pixel_y)>32) - a = Pixel_y > 0 ? round(Pixel_y/32) : Ceiling(Pixel_y/32) + a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) X.y += a Pixel_y %= 32 diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm index 6fb2b67051..30bf107ad0 100644 --- a/code/datums/components/archaeology.dm +++ b/code/datums/components/archaeology.dm @@ -6,7 +6,7 @@ var/datum/callback/callback /datum/component/archaeology/Initialize(_prob2drop, list/_archdrops = list(), datum/callback/_callback) - prob2drop = Clamp(_prob2drop, 0, 100) + prob2drop = CLAMP(_prob2drop, 0, 100) archdrops = _archdrops callback = _callback RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/Dig) diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index a28213b0b5..20cc9cd134 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -48,7 +48,7 @@ if(old_dir == new_dir) return remove() - var/rotation = SimplifyDegrees(dir2angle(new_dir)-dir2angle(old_dir)) + var/rotation = SIMPLIFY_DEGREES(dir2angle(new_dir)-dir2angle(old_dir)) pic.dir = turn(pic.dir, rotation) apply() diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 1637655d18..03badb2069 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -43,7 +43,7 @@ addtimer(CALLBACK(src, .proc/charge), charge_rate) /datum/action/innate/dash/proc/charge() - current_charges = Clamp(current_charges + 1, 0, max_charges) + current_charges = CLAMP(current_charges + 1, 0, max_charges) holder.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, 1) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 0c1058a287..60f90d61ad 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -185,10 +185,10 @@ if(properties["stealth"] >= 2) visibility_flags = HIDDEN_SCANNER - SetSpread(Clamp(2 ** (properties["transmittable"] - symptoms.len), VIRUS_SPREAD_BLOOD, VIRUS_SPREAD_AIRBORNE)) + SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), VIRUS_SPREAD_BLOOD, VIRUS_SPREAD_AIRBORNE)) - permeability_mod = max(Ceiling(0.4 * properties["transmittable"]), 1) - cure_chance = 15 - Clamp(properties["resistance"], -5, 5) // can be between 10 and 20 + permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) + cure_chance = 15 - CLAMP(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_rate"], 2) SetSeverity(properties["severity"]) GenerateCure(properties) @@ -243,7 +243,7 @@ // Will generate a random cure, the less resistance the symptoms have, the harder the cure. /datum/disease/advance/proc/GenerateCure() if(properties && properties.len) - var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) + var/res = CLAMP(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) cures = list(advance_cures[res]) // Get the cure name from the cure_id diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index b71c560193..73b76a9155 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(explosions) M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound) // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. else if(dist <= far_dist) - var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist + var/far_volume = CLAMP(far_dist, 30, 50) // Volume is based on explosion size and dist far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound) EX_PREPROCESS_CHECK_TICK diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 5c78a0c321..82497adf45 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -101,7 +101,7 @@ "[A] slams your chest! You can't breathe!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) if(D.losebreath <= 10) - D.losebreath = Clamp(D.losebreath + 5, 0, 10) + D.losebreath = CLAMP(D.losebreath + 5, 0, 10) D.adjustOxyLoss(10) add_logs(A, D, "quickchoked") return 1 @@ -112,7 +112,7 @@ playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) D.apply_damage(5, BRUTE) if(D.silent <= 10) - D.silent = Clamp(D.silent + 10, 0, 10) + D.silent = CLAMP(D.silent + 10, 0, 10) add_logs(A, D, "neck chopped") return 1 diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index f9883cfe50..3599c60f89 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -38,7 +38,7 @@ if (user.client) user.client.images += bar - progress = Clamp(progress, 0, goal) + progress = CLAMP(progress, 0, goal) bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" if (!shown) user.client.images += bar diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index f065ccfeab..68d8ebc31f 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -34,7 +34,7 @@ var/strength if(steps>1) - strength = InverseSquareLaw(intensity, max(range_modifier*steps, 1), 1) + strength = INVERSE_SQUARE(intensity, max(range_modifier*steps, 1), 1) else strength = intensity @@ -42,7 +42,7 @@ qdel(src) return - radiate(atoms, Floor(strength)) + radiate(atoms, FLOOR(strength, 1)) check_obstructions(atoms) // reduce our overall strength if there are radiation insulators diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 20d218f767..ec4b81acbe 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -60,8 +60,8 @@ if(istype(L)) //this is probably more safety than actually needed var/vanguard = L.stun_absorption["vanguard"] desc = initial(desc) - desc += "
    [Floor(vanguard["stuns_absorbed"] * 0.1)] seconds of stuns held back.\ - [GLOB.ratvar_awakens ? "":"
    [Floor(min(vanguard["stuns_absorbed"] * 0.025, 20))] seconds of stun will affect you."]" + desc += "
    [FLOOR(vanguard["stuns_absorbed"] * 0.1, 1)] seconds of stuns held back.\ + [GLOB.ratvar_awakens ? "":"
    [FLOOR(min(vanguard["stuns_absorbed"] * 0.025, 20), 1)] seconds of stun will affect you."]" ..() /datum/status_effect/vanguard_shield/Destroy() @@ -87,7 +87,7 @@ var/vanguard = owner.stun_absorption["vanguard"] var/stuns_blocked = 0 if(vanguard) - stuns_blocked = Floor(min(vanguard["stuns_absorbed"] * 0.25, 400)) + stuns_blocked = FLOOR(min(vanguard["stuns_absorbed"] * 0.25, 400), 1) vanguard["end_time"] = 0 //so it doesn't absorb the stuns we're about to apply if(owner.stat != DEAD) var/message_to_owner = "You feel your Vanguard quietly fade..." diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 2ea1469481..cc64cc2eb8 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -230,7 +230,7 @@ if(prob(severity * 0.15)) to_chat(owner, "\"[text2ratvar(pick(mania_messages))]\"") owner.playsound_local(get_turf(motor), hum, severity, 1) - owner.adjust_drugginess(Clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1 + owner.adjust_drugginess(CLAMP(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1 if(owner.hallucination < 50) owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1 if(owner.dizziness < 50) @@ -310,7 +310,7 @@ var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) var/icon_height = I.Height() bleed_overlay.pixel_x = -owner.pixel_x - bleed_overlay.pixel_y = Floor(icon_height * 0.25) + bleed_overlay.pixel_y = FLOOR(icon_height * 0.25, 1) bleed_overlay.transform = matrix() * (icon_height/world.icon_size) //scale the bleed overlay's size based on the target's icon size bleed_underlay.pixel_x = -owner.pixel_x bleed_underlay.transform = matrix() * (icon_height/world.icon_size) * 3 diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index c5c813ecfc..9e4bf51d41 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -42,7 +42,7 @@ /mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume) ..() if(exposed_temperature) - adjustFireLoss(Clamp(0.01 * exposed_temperature, 1, 5)) + adjustFireLoss(CLAMP(0.01 * exposed_temperature, 1, 5)) else adjustFireLoss(5) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 4f26563da1..c0516fa2dd 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) B.hud_used.blobpwrdisplay.maptext = "
    [round(blob_core.obj_integrity)]
    " /mob/camera/blob/proc/add_points(points) - blob_points = Clamp(blob_points + points, 0, max_blob_points) + blob_points = CLAMP(blob_points + points, 0, max_blob_points) hud_used.blobpwrdisplay.maptext = "
    [round(blob_points)]
    " /mob/camera/blob/say(message) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index e5a8c9b6f3..19f9e37319 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -207,7 +207,7 @@ to_chat(cyborg, "You start to charge from the [sigil_name]...") if(!do_after(cyborg, 50, target = src, extra_checks = CALLBACK(src, .proc/cyborg_checks, cyborg, TRUE))) return - var/giving_power = min(Floor(cyborg.cell.maxcharge - cyborg.cell.charge, MIN_CLOCKCULT_POWER), get_clockwork_power()) //give the borg either all our power or their missing power floored to MIN_CLOCKCULT_POWER + var/giving_power = min(FLOOR(cyborg.cell.maxcharge - cyborg.cell.charge, MIN_CLOCKCULT_POWER), get_clockwork_power()) //give the borg either all our power or their missing power floored to MIN_CLOCKCULT_POWER if(adjust_clockwork_power(-giving_power)) cyborg.visible_message("[cyborg] glows a brilliant orange!") var/previous_color = cyborg.color diff --git a/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm index a5af47ff05..74f7119193 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm @@ -90,7 +90,7 @@ if(amount_temp < 2) to_chat(user, "You need at least 2 floor tiles to convert into power.") return TRUE - if(IsOdd(amount_temp)) + if(ISODD(amount_temp)) amount_temp-- no_delete = TRUE use(amount_temp) @@ -239,7 +239,7 @@ if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, target = src, \ extra_checks = CALLBACK(fabricator, /obj/item/clockwork/replica_fabricator.proc/fabricator_repair_checks, repair_values, src, user, TRUE))) break - obj_integrity = Clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) + obj_integrity = CLAMP(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) adjust_clockwork_power(-repair_values["power_required"]) playsound(src, 'sound/machines/click.ogg', 50, 1) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index 5aa626bac5..da1f5965bd 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -97,7 +97,7 @@ if(ishuman(M.current)) human_servants++ construct_limit = human_servants / 4 //1 per 4 human servants, and a maximum of 3 marauders - construct_limit = Clamp(construct_limit, 1, 3) + construct_limit = CLAMP(construct_limit, 1, 3) /datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital() channel_time = initial(channel_time) diff --git a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm index b95d9cc0db..447b077d87 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/mania_motor.dm @@ -60,4 +60,4 @@ break if(!M) M = H.apply_status_effect(STATUS_EFFECT_MANIAMOTOR, src) - M.severity = Clamp(M.severity + ((11 - get_dist(src, H)) * efficiency * efficiency), 0, MAX_MANIA_SEVERITY) + M.severity = CLAMP(M.severity + ((11 - get_dist(src, H)) * efficiency * efficiency), 0, MAX_MANIA_SEVERITY) diff --git a/code/game/gamemodes/clock_cult/clock_structures/taunting_trail.dm b/code/game/gamemodes/clock_cult/clock_structures/taunting_trail.dm index 9d4667ee9f..e417cbbc32 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/taunting_trail.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/taunting_trail.dm @@ -57,5 +57,5 @@ L.confused = min(L.confused + 15, 50) L.dizziness = min(L.dizziness + 15, 50) if(L.confused >= 25) - L.Knockdown(Floor(L.confused * 0.8)) + L.Knockdown(FLOOR(L.confused * 0.8, 1)) take_damage(max_integrity) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index b7a6580570..4918e94131 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -25,7 +25,7 @@ if (prob(meteorminutes/2)) wavetype = GLOB.meteors_catastrophic - var/ramp_up_final = Clamp(round(meteorminutes/rampupdelta), 1, 10) + var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 908ecd797f..e35eaed9f1 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -353,7 +353,7 @@ var/N = text2num(user_input) if(!N) return - timer_set = Clamp(N,minimum_timer_set,maximum_timer_set) + timer_set = CLAMP(N,minimum_timer_set,maximum_timer_set) . = TRUE if("safety") if(auth && yes_code) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index cbdc28883f..e9390a3cf5 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -161,7 +161,7 @@ return log_activity("changed greater than charge filter to \"[new_filter]\"") if(new_filter) - new_filter = Clamp(new_filter, 0, 100) + new_filter = CLAMP(new_filter, 0, 100) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) result_filters["Charge Above"] = new_filter if(href_list["below_filter"]) @@ -171,7 +171,7 @@ return log_activity("changed lesser than charge filter to \"[new_filter]\"") if(new_filter) - new_filter = Clamp(new_filter, 0, 100) + new_filter = CLAMP(new_filter, 0, 100) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) result_filters["Charge Below"] = new_filter if(href_list["access_filter"]) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 2d1d771203..a4881546cf 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -211,7 +211,7 @@ if("pressure") var/target = input("New target pressure:", name, output_info ? output_info["internal"] : 0) as num|null if(!isnull(target) && !..()) - target = Clamp(target, 0, 50 * ONE_ATMOSPHERE) + target = CLAMP(target, 0, 50 * ONE_ATMOSPHERE) signal.data += list("tag" = output_tag, "set_internal_pressure" = target) . = TRUE radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9fa196bd46..7bbd545981 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -337,12 +337,12 @@ if(!num) num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null) if(num) - radduration = Wrap(num, 1, RADIATION_DURATION_MAX+1) + radduration = WRAP(num, 1, RADIATION_DURATION_MAX+1) if("setstrength") if(!num) num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null) if(num) - radstrength = Wrap(num, 1, RADIATION_STRENGTH_MAX+1) + radstrength = WRAP(num, 1, RADIATION_STRENGTH_MAX+1) if("screen") current_screen = href_list["text"] if("rejuv") @@ -353,13 +353,13 @@ if("setbufferlabel") var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null) if(num && text) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) + num = CLAMP(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) buffer_slot["label"] = text if("setbuffer") if(num && viable_occupant) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) + num = CLAMP(num, 1, NUMBER_OF_BUFFERS) buffer[num] = list( "label"="Buffer[num]:[viable_occupant.real_name]", "UI"=viable_occupant.dna.uni_identity, @@ -370,7 +370,7 @@ ) if("clearbuffer") if(num) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) + num = CLAMP(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) buffer_slot.Cut() @@ -387,7 +387,7 @@ apply_buffer(SCANNER_ACTION_MIXED,num) if("injector") if(num && injectorready < world.time) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) + num = CLAMP(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) var/obj/item/dnainjector/timed/I @@ -436,11 +436,11 @@ injectorready = world.time + INJECTOR_TIMEOUT if("loaddisk") if(num && diskette && diskette.fields) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) + num = CLAMP(num, 1, NUMBER_OF_BUFFERS) buffer[num] = diskette.fields.Copy() if("savedisk") if(num && diskette && !diskette.read_only) - num = Clamp(num, 1, NUMBER_OF_BUFFERS) + num = CLAMP(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) diskette.name = "data disk \[[buffer_slot["label"]]\]" @@ -454,8 +454,8 @@ delayed_action = list("action"=text2num(href_list["delayaction"]),"buffer"=num) if("pulseui","pulsese") if(num && viable_occupant && connected) - radduration = Wrap(radduration, 1, RADIATION_DURATION_MAX+1) - radstrength = Wrap(radstrength, 1, RADIATION_STRENGTH_MAX+1) + radduration = WRAP(radduration, 1, RADIATION_DURATION_MAX+1) + radstrength = WRAP(radstrength, 1, RADIATION_STRENGTH_MAX+1) var/locked_state = connected.locked connected.locked = TRUE @@ -471,7 +471,7 @@ switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage if("pulseui") var/len = length(viable_occupant.dna.uni_identity) - num = Wrap(num, 1, len+1) + num = WRAP(num, 1, len+1) num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low var/block = round((num-1)/DNA_BLOCK_SIZE)+1 @@ -487,7 +487,7 @@ viable_occupant.updateappearance(mutations_overlay_update=1) if("pulsese") var/len = length(viable_occupant.dna.struc_enzymes) - num = Wrap(num, 1, len+1) + num = WRAP(num, 1, len+1) num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) var/block = round((num-1)/DNA_BLOCK_SIZE)+1 @@ -518,10 +518,11 @@ ran = round(ran) //negative, so floor it else ran = -round(-ran) //positive, so ceiling it - return num2hex(Wrap(hex2num(input)+ran, 0, 16**length), length) + return num2hex(WRAP(hex2num(input)+ran, 0, 16**length), length) -/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position_we_were_supposed_to_hit, radduration, number_of_blocks) - return Wrap(round(position_we_were_supposed_to_hit + gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration), 1), 1, number_of_blocks+1) +/obj/machinery/computer/scan_consolenew/proc/randomize_radiation_accuracy(position, radduration, number_of_blocks) + var/val = round(gaussian(0, RADIATION_ACCURACY_MULTIPLIER/radduration) + position, 1) + return WRAP(val, 1, number_of_blocks+1) /obj/machinery/computer/scan_consolenew/proc/get_viable_occupant() var/mob/living/carbon/viable_occupant = null @@ -532,7 +533,7 @@ return viable_occupant /obj/machinery/computer/scan_consolenew/proc/apply_buffer(action,buffer_num) - buffer_num = Clamp(buffer_num, 1, NUMBER_OF_BUFFERS) + buffer_num = CLAMP(buffer_num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[buffer_num] var/mob/living/carbon/viable_occupant = get_viable_occupant() if(istype(buffer_slot)) diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm index 36da1288a9..2419dd2299 100644 --- a/code/game/machinery/computer/gulag_teleporter.dm +++ b/code/game/machinery/computer/gulag_teleporter.dm @@ -106,7 +106,7 @@ return if(!new_goal) new_goal = default_goal - id.goal = Clamp(new_goal, 0, 1000) //maximum 1000 points + id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points if("toggle_open") if(teleporter.locked) to_chat(usr, "The teleporter is locked") diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 959253036b..6670bfbfa7 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -154,8 +154,14 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. ..() +<<<<<<< HEAD var/danger = GLOB.joined_player_list.len - SSticker.mode.syndicates.len danger = Ceiling(danger, 10) +======= + var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) + var/danger = GLOB.joined_player_list.len - nukeops.len + danger = CEILING(danger, 10) +>>>>>>> 25080ff... defines math (#33498) scaleTC(danger) /obj/machinery/computer/telecrystals/boss/proc/scaleTC(amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc. diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index f0e1e8a18a..b9a2a68b34 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -33,7 +33,7 @@ to_chat(user, "You begin repairing [src]...") playsound(loc, WT.usesound, 40, 1) if(do_after(user, 40*I.toolspeed, target = src)) - obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity) + obj_integrity = CLAMP(obj_integrity + 20, 0, max_integrity) else return ..() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 4c0d4a1804..a622f0af3d 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -142,7 +142,7 @@ . /= 10 /obj/machinery/door_timer/proc/set_timer(value) - var/new_time = Clamp(value,0,MAX_TIMER) + var/new_time = CLAMP(value,0,MAX_TIMER) . = new_time == timer_duration //return 1 on no change timer_duration = new_time diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 06cdfcda7d..a67ce24c9c 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -53,9 +53,9 @@ new /obj/item/pipe_meter(loc) wait = world.time + 15 if(href_list["layer_up"]) - piping_layer = Clamp(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + piping_layer = CLAMP(++piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) if(href_list["layer_down"]) - piping_layer = Clamp(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + piping_layer = CLAMP(--piping_layer, PIPING_LAYER_MIN, PIPING_LAYER_MAX) return /obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 9356314973..cdbdb195cc 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -256,7 +256,7 @@ use_stored_power(50) /obj/machinery/shieldwallgen/proc/use_stored_power(amount) - power = Clamp(power - amount, 0, maximum_stored_power) + power = CLAMP(power - amount, 0, maximum_stored_power) update_activity() /obj/machinery/shieldwallgen/proc/update_activity() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index b45b393ab2..f7a18ff246 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -121,7 +121,7 @@ settableTemperatureRange = cap * 30 efficiency = (cap + 1) * 10000 - targetTemperature = Clamp(targetTemperature, + targetTemperature = CLAMP(targetTemperature, max(settableTemperatureMedian - settableTemperatureRange, TCMB), settableTemperatureMedian + settableTemperatureRange) @@ -223,7 +223,7 @@ target= text2num(target) + T0C . = TRUE if(.) - targetTemperature = Clamp(round(target), + targetTemperature = CLAMP(round(target), max(settableTemperatureMedian - settableTemperatureRange, TCMB), settableTemperatureMedian + settableTemperatureRange) if("eject") diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 5b510d965e..528faba57f 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -205,7 +205,7 @@ /obj/machinery/syndicatebomb/proc/settings(mob/user) var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station - timer_set = Clamp(new_timer, minimum_timer, maximum_timer) + timer_set = CLAMP(new_timer, minimum_timer, maximum_timer) loc.visible_message("[icon2html(src, viewers(src))] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index bfa89db368..d3598d4866 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -175,7 +175,7 @@ for(var/datum/data/vending_product/machine_content in machine) if(refill.charges[charge_type] == 0) break - var/restock = Ceiling(((machine_content.max_amount - machine_content.amount)/to_restock)*tmp_charges) + var/restock = CEILING(((machine_content.max_amount - machine_content.amount)/to_restock)*tmp_charges, 1) if(restock > refill.charges[charge_type]) restock = refill.charges[charge_type] machine_content.amount += restock diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 1766a8cc3a..6ef98120f5 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -188,7 +188,7 @@ return queue.len /obj/machinery/mecha_part_fabricator/proc/remove_from_queue(index) - if(!isnum(index) || !IsInteger(index) || !istype(queue) || (index<1 || index>queue.len)) + if(!isnum(index) || !ISINTEGER(index) || !istype(queue) || (index<1 || index>queue.len)) return FALSE queue.Cut(index,++index) return TRUE @@ -375,8 +375,8 @@ if(href_list["queue_move"] && href_list["index"]) var/index = afilter.getNum("index") var/new_index = index + afilter.getNum("queue_move") - if(isnum(index) && isnum(new_index) && IsInteger(index) && IsInteger(new_index)) - if(IsInRange(new_index,1,queue.len)) + if(isnum(index) && isnum(new_index) && ISINTEGER(index) && ISINTEGER(new_index)) + if(ISINRANGE(new_index,1,queue.len)) queue.Swap(index,new_index) return update_queue_on_page() if(href_list["clear_queue"]) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 5688214044..a7115abd1d 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -94,7 +94,7 @@ /obj/mecha/working/ripley/mining/Initialize() . = ..() if(cell) - cell.charge = Floor(cell.charge * 0.25) //Starts at very low charge + cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge if(prob(70)) //Maybe add a drill if(prob(15)) //Possible diamond drill... Feeling lucky? var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 04737f2e4c..70a6f1bdba 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -27,8 +27,13 @@ aSignal.name = "[name] core" aSignal.code = rand(1,100) +<<<<<<< HEAD aSignal.frequency = rand(1200, 1599) if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven! +======= + aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) + if(ISMULTIPLE(aSignal.frequency, 2))//signaller frequencies are always uneven! +>>>>>>> 25080ff... defines math (#33498) aSignal.frequency++ if(new_lifespan) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 8ac9643c39..11336cd06a 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -187,7 +187,7 @@ /obj/effect/chrono_field/update_icon() var/ttk_frame = 1 - (tickstokill / initial(tickstokill)) - ttk_frame = Clamp(Ceiling(ttk_frame * CHRONO_FRAME_COUNT), 1, CHRONO_FRAME_COUNT) + ttk_frame = CLAMP(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT) if(ttk_frame != RPpos) RPpos = ttk_frame mob_underlay.icon_state = "frame[RPpos]" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index bbeed24168..afed9c4b4c 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -69,7 +69,7 @@ if(powered) //so it doesn't show charge if it's unpowered if(cell) var/ratio = cell.charge / cell.maxcharge - ratio = Ceiling(ratio*4) * 25 + ratio = CEILING(ratio*4, 1) * 25 add_overlay("[initial(icon_state)]-charge[ratio]") /obj/item/defibrillator/CheckParts(list/parts_list) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index cdd95a2f71..4ea91ccccf 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -169,7 +169,7 @@ // Negative numbers will subtract /obj/item/device/lightreplacer/proc/AddUses(amount = 1) - uses = Clamp(uses + amount, 0, max_uses) + uses = CLAMP(uses + amount, 0, max_uses) /obj/item/device/lightreplacer/proc/AddShards(amount = 1, user) bulb_shards += amount diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 338f113afb..5afc8602ff 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -228,7 +228,7 @@ effective or pretty fucking useless. charge = max(0,charge - 25)//Quick decrease in light else charge = min(max_charge,charge + 50) //Charge in the dark - animate(user,alpha = Clamp(255 - charge,0,255),time = 10) + animate(user,alpha = CLAMP(255 - charge,0,255),time = 10) /obj/item/device/jammer diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 334be4a645..e14363a1c1 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -166,7 +166,7 @@ /obj/item/dice/proc/diceroll(mob/user) result = rand(1, sides) if(rigged && result != rigged) - if(prob(Clamp(1/(sides - 1) * 100, 25, 80))) + if(prob(CLAMP(1/(sides - 1) * 100, 25, 80))) result = rigged var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be var/comment = "" diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index dd0d397e81..0375e5529e 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -87,7 +87,7 @@ return var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num if(user.get_active_held_item() == src) - newtime = Clamp(newtime, 10, 60000) + newtime = CLAMP(newtime, 10, 60000) det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") @@ -204,7 +204,7 @@ /obj/item/grenade/plastic/c4/attack_self(mob/user) var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num if(user.get_active_held_item() == src) - newtime = Clamp(newtime, 10, 60000) + newtime = CLAMP(newtime, 10, 60000) timer = newtime to_chat(user, "Timer set for [timer] seconds.") diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index 98121f7772..d13d6cc1dd 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -75,7 +75,7 @@ drowse() return if(bloodthirst < HIS_GRACE_CONSUME_OWNER) - adjust_bloodthirst(1 + Floor(LAZYLEN(contents) * 0.5)) //Maybe adjust this? + adjust_bloodthirst(1 + FLOOR(LAZYLEN(contents) * 0.5, 1)) //Maybe adjust this? else adjust_bloodthirst(1) //don't cool off rapidly once we're at the point where His Grace consumes all. var/mob/living/master = get_atom_on_turf(src, /mob/living) @@ -164,9 +164,9 @@ /obj/item/his_grace/proc/adjust_bloodthirst(amt) prev_bloodthirst = bloodthirst if(prev_bloodthirst < HIS_GRACE_CONSUME_OWNER) - bloodthirst = Clamp(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER) + bloodthirst = CLAMP(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER) else - bloodthirst = Clamp(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP) + bloodthirst = CLAMP(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP) update_stats() /obj/item/his_grace/proc/update_stats() diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 9bf0b949c0..8baeee3550 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -198,8 +198,8 @@ return target var/x_o = (target.x - starting.x) var/y_o = (target.y - starting.y) - var/new_x = Clamp((starting.x + (x_o * range_multiplier)), 0, world.maxx) - var/new_y = Clamp((starting.y + (y_o * range_multiplier)), 0, world.maxy) + var/new_x = CLAMP((starting.x + (x_o * range_multiplier)), 0, world.maxx) + var/new_y = CLAMP((starting.y + (y_o * range_multiplier)), 0, world.maxy) var/turf/newtarget = locate(new_x, new_y, starting.z) return newtarget diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index e4485266b5..97e6752efb 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -616,7 +616,7 @@ continue usage += projectile_tick_speed_ecost usage += (tracked[I] * projectile_damage_tick_ecost_coefficient) - energy = Clamp(energy - usage, 0, maxenergy) + energy = CLAMP(energy - usage, 0, maxenergy) if(energy <= 0) deactivate_field() visible_message("[src] blinks \"ENERGY DEPLETED\".") @@ -626,7 +626,7 @@ if(iscyborg(host.loc)) host = host.loc else - energy = Clamp(energy + energy_recharge, 0, maxenergy) + energy = CLAMP(energy + energy_recharge, 0, maxenergy) return if((host.cell.charge >= (host.cell.maxcharge * cyborg_cell_critical_percentage)) && (energy < maxenergy)) host.cell.use(energy_recharge*energy_recharge_cyborg_drain_coefficient) diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index fb25cb1d76..93056adc99 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -35,14 +35,14 @@ if(TH.force_wielded > initial(TH.force_wielded)) to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!") return - TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay + TH.force_wielded = CLAMP(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") I.sharpness = IS_SHARP_ACCURATE - I.force = Clamp(I.force + increment, 0, max) - I.throwforce = Clamp(I.throwforce + increment, 0, max) + I.force = CLAMP(I.force + increment, 0, max) + I.throwforce = CLAMP(I.throwforce + increment, 0, max) I.name = "[prefix] [I.name]" name = "worn out [name]" desc = "[desc] At least, it used to." diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 1faad3462b..7cea6d71e8 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -37,9 +37,9 @@ /obj/item/stack/proc/update_weight() if(amount <= (max_amount * (1/3))) - w_class = Clamp(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) + w_class = CLAMP(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class) else if (amount <= (max_amount * (2/3))) - w_class = Clamp(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) + w_class = CLAMP(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class) else w_class = full_w_class diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 3d1c091a2b..0109b67b00 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -194,7 +194,7 @@ pressure = text2num(pressure) . = TRUE if(.) - distribute_pressure = Clamp(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) + distribute_pressure = CLAMP(round(pressure), TANK_MIN_RELEASE_PRESSURE, TANK_MAX_RELEASE_PRESSURE) /obj/item/tank/remove_air(amount) return air_contents.remove(amount) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 1c20c95e93..415cd02585 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD #define WELDER_FUEL_BURN_INTERVAL 13 /obj/item/weldingtool name = "welding tool" @@ -336,4 +337,350 @@ if(get_fuel() < max_fuel && nextrefueltick < world.time) nextrefueltick = world.time + 10 reagents.add_reagent("welding_fuel", 1) +======= +#define WELDER_FUEL_BURN_INTERVAL 13 +/obj/item/weldingtool + name = "welding tool" + desc = "A standard edition welder provided by Nanotrasen." + icon = 'icons/obj/tools.dmi' + icon_state = "welder" + item_state = "welder" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + force = 3 + throwforce = 5 + hitsound = "swing_hit" + usesound = 'sound/items/welder.ogg' + var/acti_sound = 'sound/items/welderactivate.ogg' + var/deac_sound = 'sound/items/welderdeactivate.ogg' + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_SMALL + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) + resistance_flags = FIRE_PROOF + + materials = list(MAT_METAL=70, MAT_GLASS=30) + var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) + var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) + var/max_fuel = 20 //The max amount of fuel the welder can hold + var/change_icons = 1 + var/can_off_process = 0 + var/light_intensity = 2 //how powerful the emitted light is when used. + var/burned_fuel_for = 0 //when fuel was last removed + heat = 3800 + toolspeed = 1 + +/obj/item/weldingtool/Initialize() + . = ..() + create_reagents(max_fuel) + reagents.add_reagent("welding_fuel", max_fuel) + update_icon() + + +/obj/item/weldingtool/proc/update_torch() + if(welding) + add_overlay("[initial(icon_state)]-on") + item_state = "[initial(item_state)]1" + else + item_state = "[initial(item_state)]" + + +/obj/item/weldingtool/update_icon() + cut_overlays() + if(change_icons) + var/ratio = get_fuel() / max_fuel + ratio = CEILING(ratio*4, 1) * 25 + add_overlay("[initial(icon_state)][ratio]") + update_torch() + return + + +/obj/item/weldingtool/process() + switch(welding) + if(0) + force = 3 + damtype = "brute" + update_icon() + if(!can_off_process) + STOP_PROCESSING(SSobj, src) + return + //Welders left on now use up fuel, but lets not have them run out quite that fast + if(1) + force = 15 + damtype = "fire" + ++burned_fuel_for + if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) + remove_fuel(1) + update_icon() + + //This is to start fires. process() is only called if the welder is on. + open_flame() + + +/obj/item/weldingtool/suicide_act(mob/user) + user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") + return (FIRELOSS) + + +/obj/item/weldingtool/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/screwdriver)) + flamethrower_screwdriver(I, user) + else if(istype(I, /obj/item/stack/rods)) + flamethrower_rods(I, user) + else + . = ..() + update_icon() + +/obj/item/weldingtool/proc/explode() + var/turf/T = get_turf(loc) + var/plasmaAmount = reagents.get_reagent_amount("plasma") + dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder + qdel(src) + +/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user) + if(!istype(H)) + return ..() + + var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) + + if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) + if(src.remove_fuel(1)) + playsound(loc, usesound, 50, 1) + if(user == H) + user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") + if(!do_mob(user, H, 50)) + return + item_heal_robotic(H, user, 15, 0) + else + return ..() + + +/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) + if(!proximity) + return + if(!status && istype(O, /obj/item/reagent_containers) && O.is_open_container()) + reagents.trans_to(O, reagents.total_volume) + to_chat(user, "You empty [src]'s fuel tank into [O].") + update_icon() + if(welding) + remove_fuel(1) + var/turf/location = get_turf(user) + location.hotspot_expose(700, 50, 1) + if(get_fuel() <= 0) + set_light(0) + + if(isliving(O)) + var/mob/living/L = O + if(L.IgniteMob()) + message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire") + log_game("[key_name(user)] set [key_name(L)] on fire") + + +/obj/item/weldingtool/attack_self(mob/user) + if(src.reagents.has_reagent("plasma")) + message_admins("[key_name_admin(user)] activated a rigged welder.") + explode() + switched_on(user) + if(welding) + set_light(light_intensity) + + update_icon() + + +//Returns the amount of fuel in the welder +/obj/item/weldingtool/proc/get_fuel() + return reagents.get_reagent_amount("welding_fuel") + + +//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() +/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) + if(!welding || !check_fuel()) + return 0 + if(amount) + burned_fuel_for = 0 + if(get_fuel() >= amount) + reagents.remove_reagent("welding_fuel", amount) + check_fuel() + if(M) + M.flash_act(light_intensity) + return TRUE + else + if(M) + to_chat(M, "You need more welding fuel to complete this task!") + return FALSE + + +//Turns off the welder if there is no more fuel (does this really need to be its own proc?) +/obj/item/weldingtool/proc/check_fuel(mob/user) + if(get_fuel() <= 0 && welding) + switched_on(user) + update_icon() + //mob icon update + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands(0) + + return 0 + return 1 + +//Switches the welder on +/obj/item/weldingtool/proc/switched_on(mob/user) + if(!status) + to_chat(user, "[src] can't be turned on while unsecured!") + return + welding = !welding + if(welding) + if(get_fuel() >= 1) + to_chat(user, "You switch [src] on.") + playsound(loc, acti_sound, 50, 1) + force = 15 + damtype = "fire" + hitsound = 'sound/items/welder.ogg' + update_icon() + START_PROCESSING(SSobj, src) + else + to_chat(user, "You need more fuel!") + switched_off(user) + else + to_chat(user, "You switch [src] off.") + playsound(loc, deac_sound, 50, 1) + switched_off(user) + +//Switches the welder off +/obj/item/weldingtool/proc/switched_off(mob/user) + welding = 0 + set_light(0) + + force = 3 + damtype = "brute" + hitsound = "swing_hit" + update_icon() + + +/obj/item/weldingtool/examine(mob/user) + ..() + to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") + +/obj/item/weldingtool/is_hot() + return welding * heat + +//Returns whether or not the welding tool is currently on. +/obj/item/weldingtool/proc/isOn() + return welding + + +/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) + if(welding) + to_chat(user, "Turn it off first!") + return + status = !status + if(status) + to_chat(user, "You resecure [src] and close the fuel tank.") + container_type = NONE + else + to_chat(user, "[src] can now be attached, modified, and refuelled.") + container_type = OPENCONTAINER_1 + add_fingerprint(user) + +/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) + if(!status) + var/obj/item/stack/rods/R = I + if (R.use(1)) + var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc) + if(!remove_item_from_storage(F)) + user.transferItemToLoc(src, F, TRUE) + F.weldtool = src + add_fingerprint(user) + to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") + user.put_in_hands(F) + else + to_chat(user, "You need one rod to start building a flamethrower!") + +/obj/item/weldingtool/ignition_effect(atom/A, mob/user) + if(welding && remove_fuel(1, user)) + . = "[user] casually lights [A] with [src], what a badass." + else + . = "" + +/obj/item/weldingtool/largetank + name = "industrial welding tool" + desc = "A slightly larger welder with a larger tank." + icon_state = "indwelder" + max_fuel = 40 + materials = list(MAT_GLASS=60) + +/obj/item/weldingtool/largetank/cyborg + name = "integrated welding tool" + desc = "An advanced welder designed to be used in robotic systems." + toolspeed = 0.5 + +/obj/item/weldingtool/largetank/flamethrower_screwdriver() + return + + +/obj/item/weldingtool/mini + name = "emergency welding tool" + desc = "A miniature welder used during emergencies." + icon_state = "miniwelder" + max_fuel = 10 + w_class = WEIGHT_CLASS_TINY + materials = list(MAT_METAL=30, MAT_GLASS=10) + change_icons = 0 + +/obj/item/weldingtool/mini/flamethrower_screwdriver() + return + +/obj/item/weldingtool/abductor + name = "alien welding tool" + desc = "An alien welding tool. Whatever fuel it uses, it never runs out." + icon = 'icons/obj/abductor.dmi' + icon_state = "welder" + toolspeed = 0.1 + light_intensity = 0 + change_icons = 0 + +/obj/item/weldingtool/abductor/process() + if(get_fuel() <= max_fuel) + reagents.add_reagent("welding_fuel", 1) + ..() + +/obj/item/weldingtool/hugetank + name = "upgraded industrial welding tool" + desc = "An upgraded welder based of the industrial welder." + icon_state = "upindwelder" + item_state = "upindwelder" + max_fuel = 80 + materials = list(MAT_METAL=70, MAT_GLASS=120) + +/obj/item/weldingtool/experimental + name = "experimental welding tool" + desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." + icon_state = "exwelder" + item_state = "exwelder" + max_fuel = 40 + materials = list(MAT_METAL=70, MAT_GLASS=120) + var/last_gen = 0 + change_icons = 0 + can_off_process = 1 + light_intensity = 1 + toolspeed = 0.5 + var/nextrefueltick = 0 + +/obj/item/weldingtool/experimental/brass + name = "brass welding tool" + desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." + resistance_flags = FIRE_PROOF | ACID_PROOF + icon_state = "brasswelder" + item_state = "brasswelder" + + +/obj/item/weldingtool/experimental/process() + ..() + if(get_fuel() < max_fuel && nextrefueltick < world.time) + nextrefueltick = world.time + 10 + reagents.add_reagent("welding_fuel", 1) + +>>>>>>> 25080ff... defines math (#33498) #undef WELDER_FUEL_BURN_INTERVAL \ No newline at end of file diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index ad5f69672b..ff8bcc3e1e 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -198,7 +198,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(T.intact && level == 1) //fire can't damage things hidden below the floor. return if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) - take_damage(Clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) + take_damage(CLAMP(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE)) resistance_flags |= ON_FIRE SSfire_burning.processing[src] = src diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm index 04d7f983c0..2735bd7e81 100644 --- a/code/game/objects/structures/fireplace.dm +++ b/code/game/objects/structures/fireplace.dm @@ -129,7 +129,7 @@ if(burn_time_remaining() < MAXIMUM_BURN_TIMER) flame_expiry_timer = world.time + MAXIMUM_BURN_TIMER else - fuel_added = Clamp(fuel_added + amount, 0, MAXIMUM_BURN_TIMER) + fuel_added = CLAMP(fuel_added + amount, 0, MAXIMUM_BURN_TIMER) /obj/structure/fireplace/proc/burn_time_remaining() if(lit) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 009bbcd70e..a7bfb92c45 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -30,7 +30,7 @@ return var/ratio = obj_integrity / max_integrity - ratio = Ceiling(ratio*4) * 25 + ratio = CEILING(ratio*4, 1) * 25 if(smooth) queue_smooth(src) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c0dcd866d8..306d3d0b84 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -67,7 +67,7 @@ resistance_flags |= INDESTRUCTIBLE /obj/structure/lattice/clockwork/ratvar_act() - if(IsOdd(x+y)) + if(ISODD(x+y)) icon = 'icons/obj/smooth_structures/lattice_clockwork_large.dmi' pixel_x = -9 pixel_y = -9 @@ -124,7 +124,7 @@ resistance_flags |= INDESTRUCTIBLE /obj/structure/lattice/catwalk/clockwork/ratvar_act() - if(IsOdd(x+y)) + if(ISODD(x+y)) icon = 'icons/obj/smooth_structures/catwalk_clockwork_large.dmi' pixel_x = -9 pixel_y = -9 diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 1265594eff..a73824ca2b 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -119,7 +119,7 @@ else cur_oct[cur_note] = text2num(ni) if(user.dizziness > 0 && prob(user.dizziness / 2)) - cur_note = Clamp(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7) + cur_note = CLAMP(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7) if(user.dizziness > 0 && prob(user.dizziness / 5)) if(prob(30)) cur_acc[cur_note] = "#" diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index e47afd53d4..1ae513f847 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -165,7 +165,7 @@ to_chat(user, "You can't do that right now!") return if(!isnull(new_angle)) - setAngle(NORM_ROT(new_angle)) + setAngle(SIMPLIFY_DEGREES(new_angle)) return TRUE /obj/structure/reflector/AltClick(mob/user) @@ -197,16 +197,12 @@ anchored = TRUE /obj/structure/reflector/single/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle) - var/incidence = get_angle_of_incidence(rotation_angle, P.Angle) - var/incidence_norm = get_angle_of_incidence(rotation_angle, P.Angle, FALSE) - if((incidence_norm > -90) && (incidence_norm < 90)) + var/incidence = GET_ANGLE_OF_INCIDENCE(rotation_angle, P.Angle) + var/norm_inc = WRAP(incidence, -90, 90) + var/new_angle = WRAP(rotation_angle + norm_inc, 180, -180) + if(ISINRANGE_EX(norm_inc, -90, 90)) return FALSE - var/new_angle_s = rotation_angle + incidence - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - while(new_angle_s < -180) - new_angle_s += 360 - P.Angle = new_angle_s + P.Angle = new_angle return ..() //DOUBLE @@ -228,17 +224,12 @@ anchored = TRUE /obj/structure/reflector/double/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle) - var/incidence = get_angle_of_incidence(rotation_angle, P.Angle) - var/incidence_norm = get_angle_of_incidence(rotation_angle, P.Angle, FALSE) - var/invert = ((incidence_norm > -90) && (incidence_norm < 90)) - var/new_angle_s = rotation_angle + incidence - if(invert) - new_angle_s += 180 - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - while(new_angle_s < -180) - new_angle_s += 360 - P.Angle = new_angle_s + var/incidence = GET_ANGLE_OF_INCIDENCE(rotation_angle, P.Angle) + var/norm_inc = WRAP(incidence, -90, 90) + var/new_angle = WRAP(rotation_angle + norm_inc, 180, -180) + if(ISINRANGE_EX(norm_inc, -90, 90)) + new_angle += 180 + P.Angle = new_angle return ..() //BOX diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 26582515f8..65d25055f8 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -134,8 +134,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) return 1 else return ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2b9494c535..5380f0ca20 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -380,7 +380,7 @@ return var/ratio = obj_integrity / max_integrity - ratio = Ceiling(ratio*4) * 25 + ratio = CEILING(ratio*4, 1) * 25 if(smooth) queue_smooth(src) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index b2ab28dcae..1419036d07 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -188,7 +188,7 @@ break var/list/L = list(45) - if(IsOdd(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels. + if(ISODD(dir2angle(dir))) // We're going at an angle and we want thick angled tunnels. L += -45 // Expand the edges of our tunnel diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 337bb051a8..00377e4f3f 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -54,7 +54,7 @@ var/turf/p_turf = get_turf(P) var/face_direction = get_dir(src, p_turf) var/face_angle = dir2angle(face_direction) - var/incidence_s = get_angle_of_incidence(face_angle, P.Angle) + var/incidence_s = WRAP(GET_ANGLE_OF_INCIDENCE(face_angle, P.Angle), -90, 90) var/new_angle = face_angle + incidence_s var/new_angle_s = new_angle while(new_angle_s > 180) // Translate to regular projectile degrees diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index b7ec8c36b5..87024f7832 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -92,7 +92,7 @@ var/new_volume = input(user, "Choose a volume.", "Sound Emitter", sound_volume) as null|num if(isnull(new_volume)) return - new_volume = Clamp(new_volume, 0, 100) + new_volume = CLAMP(new_volume, 0, 100) sound_volume = new_volume to_chat(user, "Volume set to [sound_volume]%.") if(href_list["edit_mode"]) @@ -115,7 +115,7 @@ var/new_radius = input(user, "Choose a radius.", "Sound Emitter", sound_volume) as null|num if(isnull(new_radius)) return - new_radius = Clamp(new_radius, 0, 127) + new_radius = CLAMP(new_radius, 0, 127) play_radius = new_radius to_chat(user, "Audible radius set to [play_radius].") if(href_list["play"]) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 587bd6b26c..38316c904f 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -220,7 +220,7 @@ var/nsd = CONFIG_GET(number/note_stale_days) var/nfd = CONFIG_GET(number/note_fresh_days) if (agegate && type == "note" && isnum(nsd) && isnum(nfd) && nsd > nfd) - var/alpha = Clamp(100 - (age - nfd) * (85 / (nsd - nfd)), 15, 100) + var/alpha = CLAMP(100 - (age - nfd) * (85 / (nsd - nfd)), 15, 100) if (alpha < 100) if (alpha <= 15) if (skipped) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index de8dff1518..0cec1ef3a8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1892,7 +1892,7 @@ return var/list/offset = splittext(href_list["offset"],",") - var/number = Clamp(text2num(href_list["object_count"]), 1, 100) + var/number = CLAMP(text2num(href_list["object_count"]), 1, 100) var/X = offset.len > 0 ? text2num(offset[1]) : 0 var/Y = offset.len > 1 ? text2num(offset[2]) : 0 var/Z = offset.len > 2 ? text2num(offset[3]) : 0 diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 9e9e727b39..0421807abe 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -435,7 +435,7 @@ else if(expression[start + 1] == "\[" && islist(v)) var/list/L = v var/index = SDQL_expression(source, expression[start + 2]) - if(isnum(index) && (!IsInteger(index) || L.len < index)) + if(isnum(index) && (!ISINTEGER(index) || L.len < index)) to_chat(usr, "Invalid list index: [index]") return null return L[index] diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 6b1edf7709..29d95c639f 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -12,7 +12,7 @@ var/vol = input(usr, "What volume would you like the sound to play at?",, 100) as null|num if(!vol) return - vol = Clamp(vol, 1, 100) + vol = CLAMP(vol, 1, 100) var/sound/admin_sound = new() admin_sound.file = S diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index f8204947f1..6f72724e1e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -185,13 +185,13 @@ Acts like a normal vent, but has an input AND output. pump_direction = 1 if("set_input_pressure" in signal.data) - input_pressure_min = Clamp(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) + input_pressure_min = CLAMP(text2num(signal.data["set_input_pressure"]),0,ONE_ATMOSPHERE*50) if("set_output_pressure" in signal.data) - output_pressure_max = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + output_pressure_max = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if("set_external_pressure" in signal.data) - external_pressure_bound = Clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = CLAMP(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) if("status" in signal.data) spawn(2) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 86c5375d07..ef4e487efd 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -127,7 +127,7 @@ Passive gate is similar to the regular pump except: pressure = text2num(pressure) . = TRUE if(.) - target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() @@ -149,7 +149,7 @@ Passive gate is similar to the regular pump except: on = !on if("set_output_pressure" in signal.data) - target_pressure = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 97bba0e534..898a8157ae 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -133,9 +133,14 @@ Thus, the two variables affect pump operation are set in New(): pressure = text2num(pressure) . = TRUE if(.) +<<<<<<< HEAD target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("Pump, [src.name], was set to [target_pressure] kPa by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Pump, [src.name], was set to [target_pressure] kPa by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") +======= + target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) + investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) +>>>>>>> 25080ff... defines math (#33498) update_icon() /obj/machinery/atmospherics/components/binary/pump/atmosinit() @@ -156,7 +161,7 @@ Thus, the two variables affect pump operation are set in New(): on = !on if("set_output_pressure" in signal.data) - target_pressure = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) + target_pressure = CLAMP(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index b154c0d3e4..bdc1ae15a3 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -133,9 +133,14 @@ Thus, the two variables affect pump operation are set in New(): rate = text2num(rate) . = TRUE if(.) +<<<<<<< HEAD transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE) investigate_log("Volume Pump, [src.name], was set to [transfer_rate] L/s by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) message_admins("Volume Pump, [src.name], was set to [transfer_rate] L/s by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") +======= + transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) + investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) +>>>>>>> 25080ff... defines math (#33498) update_icon() /obj/machinery/atmospherics/components/binary/volume_pump/receive_signal(datum/signal/signal) @@ -152,7 +157,7 @@ Thus, the two variables affect pump operation are set in New(): if("set_transfer_rate" in signal.data) var/datum/gas_mixture/air1 = AIR1 - transfer_rate = Clamp(text2num(signal.data["set_transfer_rate"]),0,air1.volume) + transfer_rate = CLAMP(text2num(signal.data["set_transfer_rate"]),0,air1.volume) if(on != old_on) investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 4baeb3dd3e..9a8034064c 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -162,7 +162,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("filter") filter_type = null diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index b706cd3cd9..b15df59662 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -152,7 +152,7 @@ pressure = text2num(pressure) . = TRUE if(.) - target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE) + target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) if("node1") var/value = text2num(params["concentration"]) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 37bfb5d952..64e6e56504 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -131,7 +131,7 @@ if("set_volume_rate" in signal.data) var/number = text2num(signal.data["set_volume_rate"]) var/datum/gas_mixture/air_contents = AIR1 - volume_rate = Clamp(number, 0, air_contents.volume) + volume_rate = CLAMP(number, 0, air_contents.volume) if("status" in signal.data) spawn(2) @@ -180,7 +180,7 @@ rate = text2num(rate) . = TRUE if(.) - volume_rate = Clamp(rate, 0, MAX_TRANSFER_RATE) + volume_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() broadcast_status() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index fa336c7a34..8d34d5adfa 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -153,7 +153,7 @@ target = text2num(target) . = TRUE if(.) - target_temperature = Clamp(target, min_temperature, max_temperature) + target_temperature = CLAMP(target, min_temperature, max_temperature) investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS) update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index a05a13217d..2c9a308ec9 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -244,10 +244,10 @@ pump_direction = text2num(signal.data["direction"]) if("set_internal_pressure" in signal.data) - internal_pressure_bound = Clamp(text2num(signal.data["set_internal_pressure"]),0,ONE_ATMOSPHERE*50) + internal_pressure_bound = CLAMP(text2num(signal.data["set_internal_pressure"]),0,ONE_ATMOSPHERE*50) if("set_external_pressure" in signal.data) - external_pressure_bound = Clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = CLAMP(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50) if("reset_external_pressure" in signal.data) external_pressure_bound = ONE_ATMOSPHERE @@ -256,10 +256,10 @@ internal_pressure_bound = 0 if("adjust_internal_pressure" in signal.data) - internal_pressure_bound = Clamp(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50) + internal_pressure_bound = CLAMP(internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]),0,ONE_ATMOSPHERE*50) if("adjust_external_pressure" in signal.data) - external_pressure_bound = Clamp(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) + external_pressure_bound = CLAMP(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) if("init" in signal.data) name = signal.data["init"] diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index fee00baf50..d2f85c7667 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -121,7 +121,7 @@ if(initialize_directions & dir) return ..() if((NORTH|EAST) & dir) - user.ventcrawl_layer = Clamp(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + user.ventcrawl_layer = CLAMP(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) if((SOUTH|WEST) & dir) - user.ventcrawl_layer = Clamp(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) + user.ventcrawl_layer = CLAMP(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX) to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.") diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 585b6e896a..ddc562bbb7 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -411,7 +411,7 @@ pressure = text2num(pressure) . = TRUE if(.) - release_pressure = Clamp(round(pressure), can_min_release_pressure, can_max_release_pressure) + release_pressure = CLAMP(round(pressure), can_min_release_pressure, can_max_release_pressure) investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("valve") var/logmsg @@ -455,7 +455,7 @@ var/N = text2num(user_input) if(!N) return - timer_set = Clamp(N,minimum_timer_set,maximum_timer_set) + timer_set = CLAMP(N,minimum_timer_set,maximum_timer_set) log_admin("[key_name(usr)] has activated a prototype valve timer") . = TRUE if("toggle_timer") diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 3f2bceaa04..807759e43c 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -131,7 +131,7 @@ pressure = text2num(pressure) . = TRUE if(.) - pump.target_pressure = Clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) + pump.target_pressure = CLAMP(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("eject") if(holding) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 92b953e7b2..b4c0aa350d 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -86,7 +86,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they /datum/export/process() ..() - cost *= GLOB.E**(k_elasticity * (1/30)) + cost *= NUM_E**(k_elasticity * (1/30)) if(cost > init_cost) cost = init_cost @@ -94,7 +94,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they /datum/export/proc/get_cost(obj/O, contr = 0, emag = 0) var/amount = get_amount(O, contr, emag) if(k_elasticity!=0) - return round((cost/k_elasticity) * (1 - GLOB.E**(-1 * k_elasticity * amount))) //anti-derivative of the marginal cost function + return round((cost/k_elasticity) * (1 - NUM_E**(-1 * k_elasticity * amount))) //anti-derivative of the marginal cost function else return round(cost * amount) //alternative form derived from L'Hopital to avoid division by 0 @@ -131,7 +131,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they else total_amount += amount - cost *= GLOB.E**(-1*k_elasticity*amount) //marginal cost modifier + cost *= NUM_E**(-1*k_elasticity*amount) //marginal cost modifier SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[O.type]", "[the_cost]")) // Total printout for the cargo console. diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index cb1712dff5..f356d6c057 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -152,7 +152,7 @@ GLOBAL_LIST(external_rsc_urls) #if (PRELOAD_RSC == 0) var/static/next_external_rsc = 0 if(external_rsc_urls && external_rsc_urls.len) - next_external_rsc = Wrap(next_external_rsc+1, 1, external_rsc_urls.len+1) + next_external_rsc = WRAP(next_external_rsc+1, 1, external_rsc_urls.len+1) preload_rsc = external_rsc_urls[next_external_rsc] #endif @@ -673,6 +673,16 @@ GLOBAL_LIST(external_rsc_urls) return TRUE . = ..() +<<<<<<< HEAD +======= +/client/proc/rescale_view(change, min, max) + var/viewscale = getviewsize(view) + var/x = viewscale[1] + var/y = viewscale[2] + x = CLAMP(x+change, min, max) + y = CLAMP(y+change, min,max) + change_view("[x]x[y]") +>>>>>>> 25080ff... defines math (#33498) /client/proc/change_view(new_size) if (isnull(new_size)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 175a23c91e..0469f31aba 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1596,12 +1596,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) toggles ^= MIDROUND_ANTAG if("parallaxup") - parallax = Wrap(parallax + 1, PARALLAX_INSANE, PARALLAX_DISABLE + 1) + parallax = WRAP(parallax + 1, PARALLAX_INSANE, PARALLAX_DISABLE + 1) if (parent && parent.mob && parent.mob.hud_used) parent.mob.hud_used.update_parallax_pref(parent.mob) if("parallaxdown") - parallax = Wrap(parallax - 1, PARALLAX_INSANE, PARALLAX_DISABLE + 1) + parallax = WRAP(parallax - 1, PARALLAX_INSANE, PARALLAX_DISABLE + 1) if (parent && parent.mob && parent.mob.hud_used) parent.mob.hud_used.update_parallax_pref(parent.mob) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 7e4b0bad89..681ba3e789 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -164,7 +164,7 @@ assembled = TRUE boost_chargerate *= cap boost_drain -= manip - powersetting_high = Clamp(laser, 0, 3) + powersetting_high = CLAMP(laser, 0, 3) emp_disable_threshold = bin*1.25 stabilizer_decay_amount = scan*3.5 airbrake_decay_amount = manip*8 @@ -194,15 +194,15 @@ /obj/item/device/flightpack/proc/adjust_momentum(amountx, amounty, reduce_amount_total = 0) if(reduce_amount_total != 0) if(momentum_x > 0) - momentum_x = Clamp(momentum_x - reduce_amount_total, 0, momentum_max) + momentum_x = CLAMP(momentum_x - reduce_amount_total, 0, momentum_max) else if(momentum_x < 0) - momentum_x = Clamp(momentum_x + reduce_amount_total, -momentum_max, 0) + momentum_x = CLAMP(momentum_x + reduce_amount_total, -momentum_max, 0) if(momentum_y > 0) - momentum_y = Clamp(momentum_y - reduce_amount_total, 0, momentum_max) + momentum_y = CLAMP(momentum_y - reduce_amount_total, 0, momentum_max) else if(momentum_y < 0) - momentum_y = Clamp(momentum_y + reduce_amount_total, -momentum_max, 0) - momentum_x = Clamp(momentum_x + amountx, -momentum_max, momentum_max) - momentum_y = Clamp(momentum_y + amounty, -momentum_max, momentum_max) + momentum_y = CLAMP(momentum_y + reduce_amount_total, -momentum_max, 0) + momentum_x = CLAMP(momentum_x + amountx, -momentum_max, momentum_max) + momentum_y = CLAMP(momentum_y + amounty, -momentum_max, momentum_max) calculate_momentum_speed() /obj/item/device/flightpack/intercept_user_move(dir, mob, newLoc, oldLoc) @@ -314,7 +314,7 @@ /obj/item/device/flightpack/proc/handle_damage() if(emp_damage) - emp_damage = Clamp(emp_damage-emp_heal_amount, 0, emp_disable_threshold * 10) + emp_damage = CLAMP(emp_damage-emp_heal_amount, 0, emp_disable_threshold * 10) if(emp_damage >= emp_disable_threshold) emp_disabled = TRUE if(emp_disabled && (emp_damage <= 0.5)) @@ -347,11 +347,11 @@ /obj/item/device/flightpack/proc/handle_boost() if(boost) - boost_charge = Clamp(boost_charge-boost_drain, 0, boost_maxcharge) + boost_charge = CLAMP(boost_charge-boost_drain, 0, boost_maxcharge) if(boost_charge < 1) deactivate_booster() if(boost_charge < boost_maxcharge) - boost_charge = Clamp(boost_charge+boost_chargerate, 0, boost_maxcharge) + boost_charge = CLAMP(boost_charge+boost_chargerate, 0, boost_maxcharge) /obj/item/device/flightpack/proc/cycle_power() powersetting < powersetting_high? (powersetting++) : (powersetting = 1) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index cc1df785b5..73d7ee04e8 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -654,7 +654,7 @@ /obj/item/clothing/suit/space/hardsuit/shielded/process() if(world.time > recharge_cooldown && current_charges < max_charges) - current_charges = Clamp((current_charges + recharge_rate), 0, max_charges) + current_charges = CLAMP((current_charges + recharge_rate), 0, max_charges) playsound(loc, 'sound/magic/charge.ogg', 50, 1) if(current_charges == max_charges) playsound(loc, 'sound/machines/ding.ogg', 50, 1) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index a5b23623f2..471dad12d7 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -29,8 +29,8 @@ /datum/round_event_control/New() if(config && !wizardevent) // Magic is unaffected by configs - earliest_start = Ceiling(earliest_start * CONFIG_GET(number/events_min_time_mul)) - min_players = Ceiling(min_players * CONFIG_GET(number/events_min_players_mul)) + earliest_start = CEILING(earliest_start * CONFIG_GET(number/events_min_time_mul), 1) + min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1) /datum/round_event_control/wizard wizardevent = 1 diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index e898729f2d..c2f98be8d5 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -67,12 +67,12 @@ kill() return - if(IsMultiple(activeFor, 4)) + if(ISMULTIPLE(activeFor, 4)) var/obj/machinery/vending/rebel = pick(vendingMachines) vendingMachines.Remove(rebel) infectedMachines.Add(rebel) rebel.shut_up = 0 rebel.shoot_inventory = 1 - if(IsMultiple(activeFor, 8)) + if(ISMULTIPLE(activeFor, 8)) originMachine.speak(pick(rampant_speeches)) \ No newline at end of file diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index eb7625e08c..1ade939ad3 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -18,7 +18,16 @@ announceWhen = rand(15, 30) /datum/round_event/disease_outbreak/start() +<<<<<<< HEAD if(!virus_type) +======= + var/advanced_virus = FALSE + max_severity = 3 + max(FLOOR((world.time - control.earliest_start)/6000, 1),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes + if(prob(20 + (10 * max_severity))) + advanced_virus = TRUE + + if(!virus_type && !advanced_virus) +>>>>>>> 25080ff... defines math (#33498) virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis) for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 35eb02f082..798bcf82dd 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -49,7 +49,7 @@ priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg') /datum/round_event/meteor_wave/tick() - if(IsMultiple(activeFor, 3)) + if(ISMULTIPLE(activeFor, 3)) spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm /datum/round_event_control/meteor_wave/threatening diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 7e17124d59..55d9e69f71 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -64,7 +64,7 @@ T = safepick(get_area_turfs(pick(station_areas))) hostiles_spawn += T - next_boss_spawn = startWhen + Ceiling(2 * number_of_hostiles / number_of_bosses) + next_boss_spawn = startWhen + CEILING(2 * number_of_hostiles / number_of_bosses, 1) /datum/round_event/portal_storm/announce(fake) set waitfor = 0 @@ -117,14 +117,14 @@ /datum/round_event/portal_storm/proc/spawn_hostile() if(!hostile_types || !hostile_types.len) return 0 - return IsMultiple(activeFor, 2) + return ISMULTIPLE(activeFor, 2) /datum/round_event/portal_storm/proc/spawn_boss() if(!boss_types || !boss_types.len) return 0 if(activeFor == next_boss_spawn) - next_boss_spawn += Ceiling(number_of_hostiles / number_of_bosses) + next_boss_spawn += CEILING(number_of_hostiles / number_of_bosses, 1) return 1 /datum/round_event/portal_storm/proc/time_to_end() diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index 8573a84c9b..c2be28fb21 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -123,7 +123,7 @@ break if(href_list["portion"]) - portion = Clamp(input("How much drink do you want to dispense per glass?") as num, 0, 50) + portion = CLAMP(input("How much drink do you want to dispense per glass?") as num, 0, 50) if(href_list["pour"] || href_list["m_pour"]) if(glasses-- <= 0) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 82ba8ab405..6ef8e5e4e9 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -124,7 +124,7 @@ return else bomb_timer = input(user, "Set the [bomb] timer from [BOMB_TIMER_MIN] to [BOMB_TIMER_MAX].", bomb, bomb_timer) as num - bomb_timer = Clamp(Ceiling(bomb_timer / 2), BOMB_TIMER_MIN, BOMB_TIMER_MAX) + bomb_timer = CLAMP(CEILING(bomb_timer / 2, 1), BOMB_TIMER_MIN, BOMB_TIMER_MAX) bomb_defused = FALSE var/message = "[ADMIN_LOOKUPFLW(user)] has trapped a [src] with [bomb] set to [bomb_timer * 2] seconds." diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 5bfcb9963d..0832f372c8 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -132,7 +132,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic /datum/chatOutput/proc/setMusicVolume(volume = "") if(volume) - adminMusicVolume = Clamp(text2num(volume), 0, 100) + adminMusicVolume = CLAMP(text2num(volume), 0, 100) //Sends client connection details to the chat to handle and save /datum/chatOutput/proc/sendClientData() diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index bd0215138a..d9c36ae0fd 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -42,7 +42,7 @@ for(var/obj/item/stock_parts/micro_laser/ML in component_parts) var/wratemod = ML.rating * 2.5 - min_wrate = Floor(10-wratemod,1) // 7,5,2,0 Clamps at 0 and 10 You want this low + min_wrate = FLOOR(10-wratemod,1) // 7,5,2,0 Clamps at 0 and 10 You want this low min_wchance = 67-(ML.rating*16) // 48,35,19,3 Clamps at 0 and 67 You want this low for(var/obj/item/circuitboard/machine/plantgenes/vaultcheck in component_parts) if(istype(vaultcheck, /obj/item/circuitboard/machine/plantgenes/vault)) // DUMB BOTANY TUTS diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index d003f40d4a..df2b07113a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -36,7 +36,7 @@ for(var/datum/plant_gene/trait/T in seed.genes) T.on_new(src, loc) seed.prepare_result(src) - transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency! + transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency! add_juice() diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 59af735b01..1a3db5ef03 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -154,8 +154,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - W.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - W.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) else return ..() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index a77808f006..b0bd44ac8a 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -28,7 +28,7 @@ if(istype(src, seed.product)) // no adding reagents if it is just a trash item seed.prepare_result(src) - transform *= TransformUsingVariable(seed.potency, 100, 0.5) + transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 add_juice() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 9eafcec71b..4fd840082b 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -881,26 +881,26 @@ /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// /obj/machinery/hydroponics/proc/adjustNutri(adjustamt) - nutrilevel = Clamp(nutrilevel + adjustamt, 0, maxnutri) + nutrilevel = CLAMP(nutrilevel + adjustamt, 0, maxnutri) /obj/machinery/hydroponics/proc/adjustWater(adjustamt) - waterlevel = Clamp(waterlevel + adjustamt, 0, maxwater) + waterlevel = CLAMP(waterlevel + adjustamt, 0, maxwater) if(adjustamt>0) adjustToxic(-round(adjustamt/4))//Toxicity dilutation code. The more water you put in, the lesser the toxin concentration. /obj/machinery/hydroponics/proc/adjustHealth(adjustamt) if(myseed && !dead) - plant_health = Clamp(plant_health + adjustamt, 0, myseed.endurance) + plant_health = CLAMP(plant_health + adjustamt, 0, myseed.endurance) /obj/machinery/hydroponics/proc/adjustToxic(adjustamt) - toxic = Clamp(toxic + adjustamt, 0, 100) + toxic = CLAMP(toxic + adjustamt, 0, 100) /obj/machinery/hydroponics/proc/adjustPests(adjustamt) - pestlevel = Clamp(pestlevel + adjustamt, 0, 10) + pestlevel = CLAMP(pestlevel + adjustamt, 0, 10) /obj/machinery/hydroponics/proc/adjustWeeds(adjustamt) - weedlevel = Clamp(weedlevel + adjustamt, 0, 10) + weedlevel = CLAMP(weedlevel + adjustamt, 0, 10) /obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index aa35b4ae07..56f80c548d 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -170,7 +170,7 @@ /// Setters procs /// /obj/item/seeds/proc/adjust_yield(adjustamt) if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable - yield = Clamp(yield + adjustamt, 0, 10) + yield = CLAMP(yield + adjustamt, 0, 10) if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. @@ -179,39 +179,39 @@ C.value = yield /obj/item/seeds/proc/adjust_lifespan(adjustamt) - lifespan = Clamp(lifespan + adjustamt, 10, 100) + lifespan = CLAMP(lifespan + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) if(C) C.value = lifespan /obj/item/seeds/proc/adjust_endurance(adjustamt) - endurance = Clamp(endurance + adjustamt, 10, 100) + endurance = CLAMP(endurance + adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) if(C) C.value = endurance /obj/item/seeds/proc/adjust_production(adjustamt) if(yield != -1) - production = Clamp(production + adjustamt, 1, 10) + production = CLAMP(production + adjustamt, 1, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) if(C) C.value = production /obj/item/seeds/proc/adjust_potency(adjustamt) if(potency != -1) - potency = Clamp(potency + adjustamt, 0, 100) + potency = CLAMP(potency + adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) if(C) C.value = potency /obj/item/seeds/proc/adjust_weed_rate(adjustamt) - weed_rate = Clamp(weed_rate + adjustamt, 0, 10) + weed_rate = CLAMP(weed_rate + adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) if(C) C.value = weed_rate /obj/item/seeds/proc/adjust_weed_chance(adjustamt) - weed_chance = Clamp(weed_chance + adjustamt, 0, 67) + weed_chance = CLAMP(weed_chance + adjustamt, 0, 67) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) if(C) C.value = weed_chance @@ -220,7 +220,7 @@ /obj/item/seeds/proc/set_yield(adjustamt) if(yield != -1) // Unharvestable shouldn't suddenly turn harvestable - yield = Clamp(adjustamt, 0, 10) + yield = CLAMP(adjustamt, 0, 10) if(yield <= 0 && get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) yield = 1 // Mushrooms always have a minimum yield of 1. @@ -229,39 +229,39 @@ C.value = yield /obj/item/seeds/proc/set_lifespan(adjustamt) - lifespan = Clamp(adjustamt, 10, 100) + lifespan = CLAMP(adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/lifespan) if(C) C.value = lifespan /obj/item/seeds/proc/set_endurance(adjustamt) - endurance = Clamp(adjustamt, 10, 100) + endurance = CLAMP(adjustamt, 10, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/endurance) if(C) C.value = endurance /obj/item/seeds/proc/set_production(adjustamt) if(yield != -1) - production = Clamp(adjustamt, 1, 10) + production = CLAMP(adjustamt, 1, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/production) if(C) C.value = production /obj/item/seeds/proc/set_potency(adjustamt) if(potency != -1) - potency = Clamp(adjustamt, 0, 100) + potency = CLAMP(adjustamt, 0, 100) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/potency) if(C) C.value = potency /obj/item/seeds/proc/set_weed_rate(adjustamt) - weed_rate = Clamp(adjustamt, 0, 10) + weed_rate = CLAMP(adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) if(C) C.value = weed_rate /obj/item/seeds/proc/set_weed_chance(adjustamt) - weed_chance = Clamp(adjustamt, 0, 67) + weed_chance = CLAMP(adjustamt, 0, 67) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_chance) if(C) C.value = weed_chance diff --git a/code/modules/integrated_electronics/core/special_pins/index_pin.dm b/code/modules/integrated_electronics/core/special_pins/index_pin.dm index 802a2612d3..51b12a0f3a 100644 --- a/code/modules/integrated_electronics/core/special_pins/index_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/index_pin.dm @@ -14,7 +14,7 @@ new_data = 1 if(isnum(new_data)) - data = Clamp(round(new_data), 1, IC_MAX_LIST_LENGTH) + data = CLAMP(round(new_data), 1, IC_MAX_LIST_LENGTH) holder.on_data_written() /datum/integrated_io/index/display_pin_type() diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index 272dbef071..4e4e447193 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -265,7 +265,7 @@ pull_data() var/incoming = get_pin_data(IC_INPUT, 1) if(!isnull(incoming)) - result = ToDegrees(incoming) + result = TODEGREES(incoming) set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -283,7 +283,7 @@ pull_data() var/incoming = get_pin_data(IC_INPUT, 1) if(!isnull(incoming)) - result = ToRadians(incoming) + result = TORADIANS(incoming) set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm index 20b80926c8..a769a16768 100644 --- a/code/modules/integrated_electronics/subtypes/data_transfer.dm +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -123,7 +123,7 @@ /obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work() var/output_index = get_pin_data(IC_INPUT, 1) - if(output_index == Clamp(output_index, 1, number_of_pins)) + if(output_index == CLAMP(output_index, 1, number_of_pins)) activate_pin(round(output_index + 1 ,1)) /obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 276d3d9ca0..c39cfeac44 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -373,7 +373,7 @@ var/rad = get_pin_data(IC_INPUT, 2) if(isnum(rad)) - rad = Clamp(rad, 0, 8) + rad = CLAMP(rad, 0, 8) radius = rad /obj/item/integrated_circuit/input/advanced_locator_list/do_work() @@ -426,7 +426,7 @@ /obj/item/integrated_circuit/input/advanced_locator/on_data_written() var/rad = get_pin_data(IC_INPUT, 2) if(isnum(rad)) - rad = Clamp(rad, 0, 8) + rad = CLAMP(rad, 0, 8) radius = rad /obj/item/integrated_circuit/input/advanced_locator/do_work() diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 42a55f1a1d..f32f414fbb 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -93,8 +93,8 @@ yo.data = round(yo.data, 1) var/turf/T = get_turf(assembly) - var/target_x = Clamp(T.x + xo.data, 0, world.maxx) - var/target_y = Clamp(T.y + yo.data, 0, world.maxy) + var/target_x = CLAMP(T.x + xo.data, 0, world.maxx) + var/target_y = CLAMP(T.y + yo.data, 0, world.maxy) shootAt(locate(target_x, target_y, T.z)) @@ -210,7 +210,7 @@ var/datum/integrated_io/detonation_time = inputs[1] var/dt if(isnum(detonation_time.data) && detonation_time.data > 0) - dt = Clamp(detonation_time.data, 1, 12)*10 + dt = CLAMP(detonation_time.data, 1, 12)*10 else dt = 15 addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt) @@ -389,9 +389,9 @@ if(!M.temporarilyRemoveItemFromInventory(A)) return - var/x_abs = Clamp(T.x + target_x_rel, 0, world.maxx) - var/y_abs = Clamp(T.y + target_y_rel, 0, world.maxy) - var/range = round(Clamp(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) + var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx) + var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy) + var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) A.forceMove(drop_location()) A.throw_at(locate(x_abs, y_abs, T.z), range, 3) diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index ef6cc644d8..6a90ff5f2a 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -88,7 +88,7 @@ var/brightness = get_pin_data(IC_INPUT, 2) if(new_color && isnum(brightness)) - brightness = Clamp(brightness, 0, 6) + brightness = CLAMP(brightness, 0, 6) light_rgb = new_color light_brightness = brightness @@ -146,7 +146,7 @@ var/selected_sound = sounds[ID] if(!selected_sound) return - vol = Clamp(vol ,0 , 100) + vol = CLAMP(vol ,0 , 100) playsound(get_turf(src), selected_sound, vol, freq, -1) /obj/item/integrated_circuit/output/sound/on_data_written() diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 564c3a4851..78b1e9682e 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -111,7 +111,7 @@ else direction_mode = SYRINGE_INJECT if(isnum(new_amount)) - new_amount = Clamp(new_amount, 0, volume) + new_amount = CLAMP(new_amount, 0, volume) transfer_amount = new_amount // Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. @@ -184,7 +184,7 @@ activate_pin(3) return - var/tramount = Clamp(transfer_amount, 0, reagents.total_volume) + var/tramount = CLAMP(transfer_amount, 0, reagents.total_volume) if(isliving(AM)) var/mob/living/L = AM @@ -235,7 +235,7 @@ else direction_mode = SYRINGE_INJECT if(isnum(new_amount)) - new_amount = Clamp(new_amount, 0, 50) + new_amount = CLAMP(new_amount, 0, 50) transfer_amount = new_amount /obj/item/integrated_circuit/reagent/pump/do_work() @@ -383,7 +383,7 @@ else direction_mode = SYRINGE_INJECT if(isnum(new_amount)) - new_amount = Clamp(new_amount, 0, 50) + new_amount = CLAMP(new_amount, 0, 50) transfer_amount = new_amount /obj/item/integrated_circuit/reagent/filter/do_work() diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 57fc16ccf9..d93aafef58 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -62,7 +62,7 @@ /obj/item/integrated_circuit/time/delay/custom/do_work() var/delay_input = get_pin_data(IC_INPUT, 1) if(delay_input && isnum(delay_input) ) - var/new_delay = Clamp(delay_input ,1 ,36000) //An hour. + var/new_delay = CLAMP(delay_input ,1 ,36000) //An hour. delay = new_delay ..() diff --git a/code/modules/integrated_electronics/subtypes/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm index 1d7f660bd4..cefa25e945 100644 --- a/code/modules/integrated_electronics/subtypes/trig.dm +++ b/code/modules/integrated_electronics/subtypes/trig.dm @@ -71,7 +71,7 @@ var/result = null var/A = get_pin_data(IC_INPUT, 1) if(!isnull(A)) - result = Tan(A) + result = TAN(A) set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -91,7 +91,7 @@ var/result = null var/A = get_pin_data(IC_INPUT, 1) if(!isnull(A)) - result = Csc(A) + result = CSC(A) set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -111,7 +111,7 @@ var/result = null var/A = get_pin_data(IC_INPUT, 1) if(!isnull(A)) - result = Sec(A) + result = SEC(A) set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -131,7 +131,7 @@ var/result = null var/A = get_pin_data(IC_INPUT, 1) if(!isnull(A)) - result = Cot(A) + result = COT(A) set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 67881f7510..598fb41e6c 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -49,7 +49,7 @@ for(var/i in 0 to name_count) new_name = "" - var/Y = rand(Floor(syllable_count/syllable_divisor), syllable_count) + var/Y = rand(FLOOR(syllable_count/syllable_divisor, 1), syllable_count) for(var/x in Y to 0) new_name += pick(syllables) full_name += " [capitalize(lowertext(new_name))]" diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 52077d2367..d47bb46c63 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -263,7 +263,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums dat += "(Order book by SS13BN)

    " dat += "" dat += "" - dat += libcomp_menu[Clamp(page,1,libcomp_menu.len)] + dat += libcomp_menu[CLAMP(page,1,libcomp_menu.len)] dat += "" dat += "
    AUTHORTITLECATEGORY
    <<<< >>>>
    " dat += "
    (Return to main menu)
    " @@ -444,7 +444,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums else var/orderid = input("Enter your order:") as num|null if(orderid) - if(isnum(orderid) && IsInteger(orderid)) + if(isnum(orderid) && ISINTEGER(orderid)) href_list["targetid"] = num2text(orderid) if(href_list["targetid"]) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 8e56acc2fb..a6c28b4146 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -232,8 +232,8 @@ var/turf/T if (source_turf) var/oldlum = source_turf.luminosity - source_turf.luminosity = Ceiling(light_range) - for(T in view(Ceiling(light_range), source_turf)) + source_turf.luminosity = CEILING(light_range, 1) + for(T in view(CEILING(light_range, 1), source_turf)) for (thing in T.get_corners(source_turf)) C = thing corners[C] = 0 diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 862de852bc..559a93b87f 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -102,7 +102,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new) if(!no_changeturf) WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called") - bounds[MAP_MINX] = min(bounds[MAP_MINX], Clamp(xcrdStart, x_lower, x_upper)) + bounds[MAP_MINX] = min(bounds[MAP_MINX], CLAMP(xcrdStart, x_lower, x_upper)) bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd) bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd) @@ -119,15 +119,15 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new) if(gridLines.len && gridLines[gridLines.len] == "") gridLines.Cut(gridLines.len) // Remove only one blank line at the end. - bounds[MAP_MINY] = min(bounds[MAP_MINY], Clamp(ycrd, y_lower, y_upper)) + bounds[MAP_MINY] = min(bounds[MAP_MINY], CLAMP(ycrd, y_lower, y_upper)) ycrd += gridLines.len - 1 // Start at the top and work down if(!cropMap && ycrd > world.maxy) if(!measureOnly) world.maxy = ycrd // Expand Y here. X is expanded in the loop below - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], Clamp(ycrd, y_lower, y_upper)) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], CLAMP(ycrd, y_lower, y_upper)) else - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], Clamp(min(ycrd, world.maxy), y_lower, y_upper)) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], CLAMP(min(ycrd, world.maxy), y_lower, y_upper)) var/maxx = xcrdStart if(measureOnly) @@ -166,7 +166,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new) ++xcrd --ycrd - bounds[MAP_MAXX] = Clamp(max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx), x_lower, x_upper) + bounds[MAP_MAXX] = CLAMP(max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx), x_lower, x_upper) CHECK_TICK diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 7fdecaaeb6..cf290112f4 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -799,13 +799,13 @@ force = 0 var/ghost_counter = ghost_check() - force = Clamp((ghost_counter * 4), 0, 75) + force = CLAMP((ghost_counter * 4), 0, 75) user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") ..() /obj/item/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) var/ghost_counter = ghost_check() - final_block_chance += Clamp((ghost_counter * 5), 0, 75) + final_block_chance += CLAMP((ghost_counter * 5), 0, 75) owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") return ..() diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 60715ef26a..e16eb0e5b2 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -82,7 +82,7 @@ if(!M || !redemption_mat) return FALSE - var/smeltable_sheets = Floor(redemption_mat.amount / M) + var/smeltable_sheets = FLOOR(redemption_mat.amount / M, 1) if(!smeltable_sheets) return FALSE diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index fe4c2fab84..ca21456163 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -68,7 +68,7 @@ if(materials.materials[href_list["choose"]]) chosen = href_list["choose"] if(href_list["chooseAmt"]) - coinsToProduce = Clamp(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000) + coinsToProduce = CLAMP(coinsToProduce + text2num(href_list["chooseAmt"]), 0, 1000) if(href_list["makeCoins"]) var/temp_coins = coinsToProduce processing = TRUE diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 458a54aa48..495b65bfa7 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -185,7 +185,7 @@ var/pollid = href_list["pollid"] if(istext(pollid)) pollid = text2num(pollid) - if(isnum(pollid) && IsInteger(pollid)) + if(isnum(pollid) && ISINTEGER(pollid)) src.poll_player(pollid) return @@ -223,7 +223,7 @@ rating = null else rating = text2num(href_list["o[optionid]"]) - if(!isnum(rating) || !IsInteger(rating)) + if(!isnum(rating) || !ISINTEGER(rating)) return if(!vote_on_numval_poll(pollid, optionid, rating)) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d19f3d4bf8..c838376d28 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -462,7 +462,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp views |= i var/new_view = input("Choose your new view", "Modify view range", 7) as null|anything in views if(new_view) - client.change_view(Clamp(new_view, 7, max_view)) + client.change_view(CLAMP(new_view, 7, max_view)) else client.change_view(CONFIG_GET(string/default_view)) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index db48302f49..aef5489b04 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -154,7 +154,7 @@ var/adjusted_amount if(amount >= 0 && maximum) var/brainloss = get_brain_damage() - var/new_brainloss = Clamp(brainloss + amount, 0, maximum) + var/new_brainloss = CLAMP(brainloss + amount, 0, maximum) if(brainloss > new_brainloss) //brainloss is over the cap already return 0 adjusted_amount = new_brainloss - brainloss diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm index 61de87b6cb..33ba8fea1d 100644 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ b/code/modules/mob/living/carbon/alien/status_procs.dm @@ -17,4 +17,4 @@ /mob/living/carbon/alien/AdjustStun(amount, updating = 1, ignore_canstun = 0) . = ..() if(!.) - move_delay_add = Clamp(move_delay_add + round(amount/2), 0, 10) + move_delay_add = CLAMP(move_delay_add + round(amount/2), 0, 10) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index aecf966350..a6efaaa967 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -185,7 +185,7 @@ /mob/living/carbon/adjustStaminaLoss(amount, updating_stamina = 1) if(status_flags & GODMODE) return 0 - staminaloss = Clamp(staminaloss + amount, 0, maxHealth*2) + staminaloss = CLAMP(staminaloss + amount, 0, maxHealth*2) if(updating_stamina) update_stamina() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e8d4baba63..75800dc75f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -89,15 +89,15 @@ for(var/obj/item/I in held_items) if(!istype(I, /obj/item/clothing)) - var/final_block_chance = I.block_chance - (Clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example + var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example if(I.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return 1 if(wear_suit) - var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier + var/final_block_chance = wear_suit.block_chance - (CLAMP((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier if(wear_suit.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return 1 if(w_uniform) - var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier + var/final_block_chance = w_uniform.block_chance - (CLAMP((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index d2c83fa39f..2b86d2945d 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -369,7 +369,7 @@ var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) var/turf/target = get_turf(P.starting) // redirect the projectile - P.preparePixelProjectile(locate(Clamp(target.x + new_x, 1, world.maxx), Clamp(target.y + new_y, 1, world.maxy), H.z), H) + P.preparePixelProjectile(locate(CLAMP(target.x + new_x, 1, world.maxx), CLAMP(target.y + new_y, 1, world.maxy), H.z), H) return -1 return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 6d1384f12f..aff8440930 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -94,8 +94,8 @@ to_chat(victim, "[H] is draining your blood!") to_chat(H, "You drain some blood!") playsound(H, 'sound/items/drink.ogg', 30, 1, -2) - victim.blood_volume = Clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - H.blood_volume = Clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + victim.blood_volume = CLAMP(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + H.blood_volume = CLAMP(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) if(!victim.blood_volume) to_chat(H, "You finish off [victim]'s blood supply!") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 5eb09a8d83..4399607984 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -182,7 +182,7 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_tox_max) * 10 - adjustToxLoss(Clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) + adjustToxLoss(CLAMP(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else clear_alert("too_much_tox") diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index e46ae2f8e6..7c40b6f144 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -59,10 +59,10 @@ clear_alert("high") /mob/living/carbon/adjust_disgust(amount) - disgust = Clamp(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) + disgust = CLAMP(disgust+amount, 0, DISGUST_LEVEL_MAXEDOUT) /mob/living/carbon/set_disgust(amount) - disgust = Clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT) + disgust = CLAMP(amount, 0, DISGUST_LEVEL_MAXEDOUT) /mob/living/carbon/cure_blind() if(disabilities & BLIND) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index dbc8da5a05..9517e1b705 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -157,7 +157,7 @@ /mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = Clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + bruteloss = CLAMP((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -168,7 +168,7 @@ /mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - oxyloss = Clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + oxyloss = CLAMP((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -187,7 +187,7 @@ /mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - toxloss = Clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + toxloss = CLAMP((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -206,7 +206,7 @@ /mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - fireloss = Clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + fireloss = CLAMP((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount @@ -217,7 +217,7 @@ /mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - cloneloss = Clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + cloneloss = CLAMP((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) updatehealth() return amount diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f589ecbb20..a5fac98d49 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -918,7 +918,7 @@ update_fire() /mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person - fire_stacks = Clamp(fire_stacks + add_fire_stacks, -20, 20) + fire_stacks = CLAMP(fire_stacks + add_fire_stacks, -20, 20) if(on_fire && fire_stacks <= 0) ExtinguishMob() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f77c65225f..8d4f29a0ee 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -55,9 +55,9 @@ /obj/item/proc/get_volume_by_throwforce_and_or_w_class() if(throwforce && w_class) - return Clamp((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 + return CLAMP((throwforce + w_class) * 5, 30, 100)// Add the item's throwforce to its weight class and multiply by 5, then clamp the value between 30 and 100 else if(w_class) - return Clamp(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 + return CLAMP(w_class * 8, 20, 100) // Multiply the item's weight class by 8, then clamp the value between 20 and 100 else return 0 diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index b12430d26d..924ab615b8 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -138,7 +138,7 @@ /mob/living/silicon/pai/proc/process_hack() if(cable && cable.machine && istype(cable.machine, /obj/machinery/door) && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1) - hackprogress = Clamp(hackprogress + 4, 0, 100) + hackprogress = CLAMP(hackprogress + 4, 0, 100) else temp = "Door Jack: Connection to airlock has been lost. Hack aborted." hackprogress = 0 @@ -283,8 +283,8 @@ /mob/living/silicon/pai/process() - emitterhealth = Clamp((emitterhealth + emitterregen), -50, emittermaxhealth) - hit_slowdown = Clamp((hit_slowdown - 1), 0, 100) + emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth) + hit_slowdown = CLAMP((hit_slowdown - 1), 0, 100) /mob/living/silicon/pai/generateStaticOverlay() return diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 83da7d9087..2c6c42e3bb 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -57,7 +57,7 @@ return FALSE //No we're not flammable /mob/living/silicon/pai/proc/take_holo_damage(amount) - emitterhealth = Clamp((emitterhealth - amount), -50, emittermaxhealth) + emitterhealth = CLAMP((emitterhealth - amount), -50, emittermaxhealth) if(emitterhealth < 0) fold_in(force = TRUE) to_chat(src, "The impact degrades your holochassis!") diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index aab1f204f6..ce0571ca4e 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -23,7 +23,7 @@ if(cell && cell.charge) if(cell.charge <= 100) uneq_all() - var/amt = Clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. + var/amt = CLAMP((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick else uneq_all() diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 5405ee03c6..bb6794a36a 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -2,7 +2,7 @@ /mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = Clamp(bruteloss + amount, 0, maxHealth) + bruteloss = CLAMP(bruteloss + amount, 0, maxHealth) if(updating_health) updatehealth() return amount diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index a977338008..c6f0f6a91c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -79,10 +79,10 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/Life() ..() - move_to_delay = Clamp((health/maxHealth) * 10, 5, 10) + move_to_delay = CLAMP((health/maxHealth) * 10, 5, 10) /mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - anger_modifier = Clamp(((maxHealth - health)/60),0,20) + anger_modifier = CLAMP(((maxHealth - health)/60),0,20) if(charging) return ranged_cooldown = world.time + ranged_cooldown_time diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 58e3e0837b..d47385efc3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -57,7 +57,7 @@ Difficulty: Very Hard L.dust() /mob/living/simple_animal/hostile/megafauna/colossus/OpenFire() - anger_modifier = Clamp(((maxHealth - health)/50),0,20) + anger_modifier = CLAMP(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + 120 if(enrage(target)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 7f12e684e8..724e4fc5c7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -101,7 +101,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/OpenFire() if(swooping) return - anger_modifier = Clamp(((maxHealth - health)/50),0,20) + anger_modifier = CLAMP(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + ranged_cooldown_time if(prob(15 + anger_modifier) && !client) @@ -227,10 +227,10 @@ Difficulty: Medium //ensure swoop direction continuity. if(negative) - if(IsInRange(x, initial_x + 1, initial_x + DRAKE_SWOOP_DIRECTION_CHANGE_RANGE)) + if(ISINRANGE(x, initial_x + 1, initial_x + DRAKE_SWOOP_DIRECTION_CHANGE_RANGE)) negative = FALSE else - if(IsInRange(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1)) + if(ISINRANGE(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1)) negative = TRUE new /obj/effect/temp_visual/dragon_flight/end(loc, negative) new /obj/effect/temp_visual/dragon_swoop(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 02fb81a1ed..8dc1780e5e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -187,7 +187,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall - anger_modifier = Clamp(((maxHealth - health) / 42),0,50) + anger_modifier = CLAMP(((maxHealth - health) / 42),0,50) burst_range = initial(burst_range) + round(anger_modifier * 0.08) beam_range = initial(beam_range) + round(anger_modifier * 0.12) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a4851bb432..4c5b94f2e3 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -111,7 +111,7 @@ /mob/living/simple_animal/updatehealth() ..() - health = Clamp(health, 0, maxHealth) + health = CLAMP(health, 0, maxHealth) /mob/living/simple_animal/update_stat() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index e7e71bf091..9654f91b6c 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -166,7 +166,7 @@ step_away(M,src) M.Friends = Friends.Copy() babies += M - M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) + M.mutation_chance = CLAMP(mutation_chance+(rand(5,-5)),0,100) SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) var/mob/living/simple_animal/slime/new_slime = pick(babies) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7f3b428978..40401cf0a8 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -153,7 +153,7 @@ GLOB.apcs_list -= src if(malfai && operating) - malfai.malf_picker.processing_time = Clamp(malfai.malf_picker.processing_time - 10,0,1000) + malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000) area.power_light = FALSE area.power_equip = FALSE area.power_environ = FALSE @@ -1253,7 +1253,7 @@ /obj/machinery/power/apc/proc/set_broken() if(malfai && operating) - malfai.malf_picker.processing_time = Clamp(malfai.malf_picker.processing_time - 10,0,1000) + malfai.malf_picker.processing_time = CLAMP(malfai.malf_picker.processing_time - 10,0,1000) stat |= BROKEN operating = FALSE if(occupier) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 1e1407e852..2d85612e1b 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -155,7 +155,7 @@ /obj/item/stock_parts/cell/proc/get_electrocute_damage() if(charge >= 1000) - return Clamp(round(charge/10000), 10, 90) + rand(-5,5) + return CLAMP(round(charge/10000), 10, 90) + rand(-5,5) else return 0 @@ -334,7 +334,7 @@ return /obj/item/stock_parts/cell/beam_rifle/emp_act(severity) - charge = Clamp((charge-(10000/severity)),0,maxcharge) + charge = CLAMP((charge-(10000/severity)),0,maxcharge) /obj/item/stock_parts/cell/emergency_light name = "miniature power cell" diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index b6f61103ca..c34edc53f3 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -94,6 +94,6 @@ /datum/powernet/proc/get_electrocute_damage() if(avail >= 1000) - return Clamp(round(avail/10000), 10, 90) + rand(-5,5) + return CLAMP(round(avail/10000), 10, 90) + rand(-5,5) else return 0 \ No newline at end of file diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 70776b5c05..95b78ff0b5 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -227,7 +227,7 @@ /obj/machinery/power/smes/proc/chargedisplay() - return Clamp(round(5.5*charge/capacity),0,5) + return CLAMP(round(5.5*charge/capacity),0,5) /obj/machinery/power/smes/process() if(stat & BROKEN) @@ -382,7 +382,7 @@ target = text2num(target) . = TRUE if(.) - input_level = Clamp(target, 0, input_level_max) + input_level = CLAMP(target, 0, input_level_max) log_smes(usr.ckey) if("output") var/target = params["target"] @@ -404,7 +404,7 @@ target = text2num(target) . = TRUE if(.) - output_level = Clamp(target, 0, output_level_max) + output_level = CLAMP(target, 0, output_level_max) log_smes(usr.ckey) /obj/machinery/power/smes/proc/log_smes(user = "") diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index fb530f128f..ab8009df55 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -378,14 +378,14 @@ if("direction") var/adjust = text2num(params["adjust"]) if(adjust) - currentdir = Clamp((360 + adjust + currentdir) % 360, 0, 359) + currentdir = CLAMP((360 + adjust + currentdir) % 360, 0, 359) targetdir = currentdir set_panels(currentdir) . = TRUE if("rate") var/adjust = text2num(params["adjust"]) if(adjust) - trackrate = Clamp(trackrate + adjust, -7200, 7200) + trackrate = CLAMP(trackrate + adjust, -7200, 7200) if(trackrate) nexttime = world.time + 36000 / abs(trackrate) . = TRUE diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 02cc80291e..5f9f6042d3 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -317,10 +317,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && co2comp > POWERLOSS_INHIBITION_GAS_THRESHOLD) - powerloss_dynamic_scaling = Clamp(powerloss_dynamic_scaling + Clamp(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) + powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling + CLAMP(co2comp - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) else - powerloss_dynamic_scaling = Clamp(powerloss_dynamic_scaling - 0.05,0, 1) - powerloss_inhibitor = Clamp(1-(powerloss_dynamic_scaling * Clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) + powerloss_dynamic_scaling = CLAMP(powerloss_dynamic_scaling - 0.05,0, 1) + powerloss_inhibitor = CLAMP(1-(powerloss_dynamic_scaling * CLAMP(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) if(matter_power) var/removed_matter = max(matter_power/MATTER_POWER_CONVERSION, 40) @@ -368,7 +368,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) var/D = sqrt(1 / max(1, get_dist(l, src))) l.hallucination += power * config_hallucination_power * D - l.hallucination = Clamp(0, 200, l.hallucination) + l.hallucination = CLAMP(0, 200, l.hallucination) for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) @@ -386,7 +386,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) supermatter_zap(src, 5, min(power*2, 20000)) else if (damage > damage_penalty_point && prob(20)) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) - supermatter_zap(src, 5, Clamp(power*2, 4000, 20000)) + supermatter_zap(src, 5, CLAMP(power*2, 4000, 20000)) if(prob(15) && power > POWER_PENALTY_THRESHOLD) supermatter_pull(src, power/750) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 4a26950217..51cb99a34f 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -62,7 +62,7 @@ pixel_x = -32 pixel_y = -32 for (var/ball in orbiting_balls) - var/range = rand(1, Clamp(orbiting_balls.len, 3, 7)) + var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7)) tesla_zap(ball, range, TESLA_MINI_POWER/7*range, TRUE) else energy = 0 // ensure we dont have miniballs of miniballs @@ -268,7 +268,7 @@ closest_grounding_rod.tesla_act(power, explosive, stun_mobs) else if(closest_mob) - var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5, 5) + var/shock_damage = CLAMP(round(power/400), 10, 90) + rand(-5, 5) closest_mob.electrocute_act(shock_damage, source, 1, tesla_shock = 1, stun = stun_mobs) if(issilicon(closest_mob)) var/mob/living/silicon/S = closest_mob diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index 09ae7cb905..b7b3a3e286 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -176,7 +176,7 @@ /obj/item/ammo_box/magazine/m12g/update_icon() ..() - icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/8)*8]" + icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" /obj/item/ammo_box/magazine/m12g/buckshot name = "shotgun magazine (12g buckshot slugs)" diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index eb36608e77..f392fda24e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -108,7 +108,7 @@ /obj/item/gun/ballistic/automatic/c20r/update_icon() ..() - icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + icon_state = "c20r[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/wt550 name = "security auto rifle" @@ -123,7 +123,7 @@ /obj/item/gun/ballistic/automatic/wt550/update_icon() ..() - icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]" + icon_state = "wt550[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""]" /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper Type U3 Uzi" @@ -304,7 +304,7 @@ /obj/item/gun/ballistic/automatic/l6_saw/update_icon() - icon_state = "l6[cover_open ? "open" : "closed"][magazine ? Ceiling(get_ammo(0)/12.5)*25 : "-empty"][suppressed ? "-suppressed" : ""]" + icon_state = "l6[cover_open ? "open" : "closed"][magazine ? CEILING(get_ammo(0)/12.5, 1)*25 : "-empty"][suppressed ? "-suppressed" : ""]" item_state = "l6[cover_open ? "openmag" : "closedmag"]" @@ -415,5 +415,5 @@ /obj/item/gun/ballistic/automatic/laser/update_icon() ..() - icon_state = "oldrifle[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]" + icon_state = "oldrifle[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""]" return diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm index e1069a6bce..7443286d24 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/beam_rifle.dm @@ -365,7 +365,7 @@ AC.sync_stats() /obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount) - aiming_time_left = Clamp(aiming_time_left + amount, 0, aiming_time) + aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time) /obj/item/ammo_casing/energy/beam_rifle name = "particle acceleration lens" @@ -416,11 +416,11 @@ HS_BB.stun = projectile_stun HS_BB.impact_structure_damage = impact_structure_damage HS_BB.aoe_mob_damage = aoe_mob_damage - HS_BB.aoe_mob_range = Clamp(aoe_mob_range, 0, 15) //Badmin safety lock + HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock HS_BB.aoe_fire_chance = aoe_fire_chance HS_BB.aoe_fire_range = aoe_fire_range HS_BB.aoe_structure_damage = aoe_structure_damage - HS_BB.aoe_structure_range = Clamp(aoe_structure_range, 0, 15) //Badmin safety lock + HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock HS_BB.wall_devastate = wall_devastate HS_BB.wall_pierce_amount = wall_pierce_amount HS_BB.structure_pierce_amount = structure_piercing diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 3adadb90eb..12b0c57d38 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -130,7 +130,7 @@ ..() if(!automatic_charge_overlays) return - var/ratio = Ceiling((cell.charge / cell.maxcharge) * charge_sections) + var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1) var/obj/item/ammo_casing/energy/shot = ammo_type[select] var/iconState = "[icon_state]_charge" var/itemState = null diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 27fb040de4..bf3ade0748 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -12,9 +12,9 @@ /obj/item/gun/magic/wand/Initialize() if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges if(prob(33)) - max_charges = Ceiling(max_charges / 3) + max_charges = CEILING(max_charges / 3, 1) else - max_charges = Ceiling(max_charges / 2) + max_charges = CEILING(max_charges / 2, 1) return ..() /obj/item/gun/magic/wand/examine(mob/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0e3bd98c68..79e2fdf903 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -168,7 +168,7 @@ /obj/item/projectile/proc/vol_by_damage() if(src.damage) - return Clamp((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then clamp the value between 30 and 100 + return CLAMP((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then clamp the value between 30 and 100 else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume @@ -188,7 +188,7 @@ def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. if(isturf(A) && hitsound_wall) - var/volume = Clamp(vol_by_damage() + 20, 0, 100) + var/volume = CLAMP(vol_by_damage() + 20, 0, 100) if(suppressed) volume = 5 playsound(loc, hitsound_wall, volume, 1, -1) @@ -259,7 +259,7 @@ return var/elapsed_time_deciseconds = (world.time - last_projectile_move) + time_offset time_offset = 0 - var/required_moves = speed > 0? Floor(elapsed_time_deciseconds / speed) : MOVES_HITSCAN //Would be better if a 0 speed made hitscan but everyone hates those so I can't make it a universal system :< + var/required_moves = speed > 0? FLOOR(elapsed_time_deciseconds / speed, 1) : MOVES_HITSCAN //Would be better if a 0 speed made hitscan but everyone hates those so I can't make it a universal system :< if(required_moves == MOVES_HITSCAN) required_moves = SSprojectiles.global_max_tick_moves else @@ -267,7 +267,7 @@ var/overrun = required_moves - SSprojectiles.global_max_tick_moves required_moves = SSprojectiles.global_max_tick_moves time_offset += overrun * speed - time_offset += Modulus(elapsed_time_deciseconds, speed) + time_offset += MODULUS(elapsed_time_deciseconds, speed) for(var/i in 1 to required_moves) pixel_move(required_moves) @@ -287,7 +287,7 @@ setAngle(Angle + ((rand() - 0.5) * spread)) if(isnull(Angle)) //Try to resolve through offsets if there's no angle set. var/turf/starting = get_turf(src) - var/turf/target = locate(Clamp(starting + xo, 1, world.maxx), Clamp(starting + yo, 1, world.maxy), starting.z) + var/turf/target = locate(CLAMP(starting + xo, 1, world.maxx), CLAMP(starting + yo, 1, world.maxy), starting.z) setAngle(Get_Angle(src, target)) if(!nondirectional_sprite) var/matrix/M = new @@ -403,7 +403,7 @@ var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y - angle = Atan2(y - oy, x - ox) + angle = ATAN2(y - oy, x - ox) return list(angle, p_x, p_y) /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 9c4bff72cb..ef609696a2 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -580,7 +580,7 @@ if (R.id == reagent) //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored - amount = Clamp(amount, 0, R.volume) + amount = CLAMP(amount, 0, R.volume) R.volume -= amount update_total() if(!safety)//So it does not handle reactions when it need not to diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 745843474e..51ddf549e0 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -211,7 +211,7 @@ /obj/machinery/chem_dispenser/emp_act(severity) var/list/datum/reagents/R = list() - var/total = min(rand(7,15), Floor(cell.charge*powerefficiency)) + var/total = min(rand(7,15), FLOOR(cell.charge*powerefficiency, 1)) var/datum/reagents/Q = new(total*10) if(beaker && beaker.reagents) R += beaker.reagents diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index a6d958220a..722ddbf15f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -126,7 +126,7 @@ target = text2num(target) . = TRUE if(.) - target_temperature = Clamp(target, 0, 1000) + target_temperature = CLAMP(target, 0, 1000) if("eject") on = FALSE eject_beaker() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 3e06449e3a..631a027d9a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -215,7 +215,7 @@ var/amount = 1 var/vol_each = min(reagents.total_volume, 50) if(text2num(many)) - amount = Clamp(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0, 10) + amount = CLAMP(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0, 10) if(!amount) return vol_each = min(reagents.total_volume / amount, 50) @@ -251,7 +251,7 @@ var/amount = 1 var/vol_each = min(reagents.total_volume, 40) if(text2num(many)) - amount = Clamp(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0, 10) + amount = CLAMP(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0, 10) if(!amount) return vol_each = min(reagents.total_volume / amount, 40) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 77fcd50306..1369a4e959 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -484,7 +484,7 @@ /obj/machinery/reagentgrinder/proc/mix_complete() if(beaker && beaker.reagents.total_volume) //Recipe to make Butter - var/butter_amt = Floor(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF) + var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF, 1) beaker.reagents.remove_reagent("milk", MILK_TO_BUTTER_COEFF * butter_amt) for(var/i in 1 to butter_amt) new /obj/item/reagent_containers/food/snacks/butter(drop_location()) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 5f76a87654..9f8e129420 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -41,7 +41,7 @@ return 0 if(method == VAPOR) //smoke, foam, spray if(M.reagents) - var/modifier = Clamp((1 - touch_protection), 0, 1) + var/modifier = CLAMP((1 - touch_protection), 0, 1) var/amount = round(reac_volume*modifier, 0.1) if(amount >= 0.5) M.reagents.add_reagent(id, amount) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 6a3b1a1637..00fd7d56a3 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -961,7 +961,7 @@ All effects don't start immediately, but rather get worse over time; the rate is var/datum/antagonist/changeling/changeling = M.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) changeling.chem_charges += metabolization_rate - changeling.chem_charges = Clamp(changeling.chem_charges, 0, changeling.chem_storage) + changeling.chem_charges = CLAMP(changeling.chem_charges, 0, changeling.chem_storage) return ..() /datum/reagent/consumable/ethanol/irishcarbomb diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 711c333896..7bee2ef958 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -850,9 +850,9 @@ /datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M) if(M.confused < 6) - M.confused = Clamp(M.confused + 3, 0, 5) + M.confused = CLAMP(M.confused + 3, 0, 5) if(M.dizziness < 6) - M.dizziness = Clamp(M.dizziness + 3, 0, 5) + M.dizziness = CLAMP(M.dizziness + 3, 0, 5) if(prob(20)) to_chat(M, "You feel confused and disorientated.") ..() diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 0e645e3798..b77dcc435a 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -168,7 +168,7 @@ return holder.remove_reagent("sorium", created_volume*4) var/turf/T = get_turf(holder.my_atom) - var/range = Clamp(sqrt(created_volume*4), 1, 6) + var/range = CLAMP(sqrt(created_volume*4), 1, 6) goonchem_vortex(T, 1, range) /datum/chemical_reaction/sorium_vortex @@ -179,7 +179,7 @@ /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - var/range = Clamp(sqrt(created_volume), 1, 6) + var/range = CLAMP(sqrt(created_volume), 1, 6) goonchem_vortex(T, 1, range) /datum/chemical_reaction/liquid_dark_matter @@ -193,7 +193,7 @@ return holder.remove_reagent("liquid_dark_matter", created_volume*3) var/turf/T = get_turf(holder.my_atom) - var/range = Clamp(sqrt(created_volume*3), 1, 6) + var/range = CLAMP(sqrt(created_volume*3), 1, 6) goonchem_vortex(T, 0, range) /datum/chemical_reaction/ldm_vortex @@ -204,7 +204,7 @@ /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - var/range = Clamp(sqrt(created_volume/2), 1, 6) + var/range = CLAMP(sqrt(created_volume/2), 1, 6) goonchem_vortex(T, 0, range) /datum/chemical_reaction/flash_powder diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 87fb2b8a9e..d60d415e9a 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -157,7 +157,7 @@ /obj/item/reagent_containers/syringe/update_icon() - var/rounded_vol = Clamp(round((reagents.total_volume / volume * 15),5), 0, 15) + var/rounded_vol = CLAMP(round((reagents.total_volume / volume * 15),5), 0, 15) cut_overlays() if(ismob(loc)) var/injoverlay diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index ed14ae63c1..c58704de4b 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -297,7 +297,7 @@ data["full_pressure"] = full_pressure data["pressure_charging"] = pressure_charging data["panel_open"] = panel_open - var/per = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100) + var/per = CLAMP(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100) data["per"] = round(per, 1) data["isai"] = isAI(user) return data diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 6c52fd4678..521f1d7f29 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -93,7 +93,7 @@ Note: Must be placed west/left of and R&D console to function. return FALSE var/power = 1000 - amount = Clamp(amount, 1, 10) + amount = CLAMP(amount, 1, 10) for(var/M in D.materials) power += round(D.materials[M] * amount / 5) power = max(3000, power) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index cf250f50f1..9c5510a814 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -290,7 +290,7 @@ return ..() to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") - M.mutation_chance = Clamp(M.mutation_chance-15,0,100) + M.mutation_chance = CLAMP(M.mutation_chance-15,0,100) qdel(src) /obj/item/slimepotion/mutator @@ -314,7 +314,7 @@ return ..() to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") - M.mutation_chance = Clamp(M.mutation_chance+12,0,100) + M.mutation_chance = CLAMP(M.mutation_chance+12,0,100) M.mutator_used = TRUE qdel(src) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index a4303078a5..3811fa0e4a 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -146,13 +146,13 @@ var/y0 = bounds[2] var/x1 = bounds[3] var/y1 = bounds[4] - if(x0 <= x1 && !IsInRange(T.x, x0, x1)) + if(x0 <= x1 && !ISINRANGE(T.x, x0, x1)) return FALSE - else if(!IsInRange(T.x, x1, x0)) + else if(!ISINRANGE(T.x, x1, x0)) return FALSE - if(y0 <= y1 && !IsInRange(T.y, y0, y1)) + if(y0 <= y1 && !ISINRANGE(T.y, y0, y1)) return FALSE - else if(!IsInRange(T.y, y1, y0)) + else if(!ISINRANGE(T.y, y1, y0)) return FALSE return TRUE @@ -534,7 +534,7 @@ rotation = dir2angle(new_dock.dir)-dir2angle(dir) if ((rotation % 90) != 0) rotation += (rotation % 90) //diagonal rotations not allowed, round up - rotation = SimplifyDegrees(rotation) + rotation = SIMPLIFY_DEGREES(rotation) if(!movement_direction) movement_direction = turn(preferred_direction, 180) @@ -888,13 +888,13 @@ var/change_per_engine = (1 - ENGINE_COEFF_MIN) / ENGINE_DEFAULT_MAXSPEED_ENGINES // 5 by default if(initial_engines > 0) change_per_engine = (1 - ENGINE_COEFF_MIN) / initial_engines // or however many it had - return Clamp(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) + return CLAMP(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) if(new_value < initial_engines) var/delta = initial_engines - new_value var/change_per_engine = 1 //doesn't really matter should not be happening for 0 engine shuttles if(initial_engines > 0) change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay - return Clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) + return CLAMP(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) /obj/docking_port/mobile/proc/in_flight() diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index 9b120c2e7f..39d340927e 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -289,7 +289,7 @@ var/mob/living/M = AM M.Knockdown(stun_amt) to_chat(M, "You're thrown back by [user]!") - AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. + AM.throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?! name = "Tail Sweep" diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index e99455c833..a385d009e5 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -18,7 +18,7 @@ return 0 var/obj/item/bodypart/affecting = C.get_bodypart("chest") - affecting.receive_damage(Clamp(brute_dam/2, 15, 50), Clamp(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage + affecting.receive_damage(CLAMP(brute_dam/2, 15, 50), CLAMP(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage C.visible_message("[C]'s [src.name] has been violently dismembered!") C.emote("scream") drop_limb() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 51e39605c4..f8f57c650f 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -199,7 +199,7 @@ return var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num - set_distance(Clamp(range, 0, max_light_beam_distance)) + set_distance(CLAMP(range, 0, max_light_beam_distance)) assume_rgb(C) /obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 02f1ee4ec3..102ac9720f 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -111,7 +111,7 @@ if(safe_oxygen_max) if(O2_pp > safe_oxygen_max) var/ratio = (breath_gases[/datum/gas/oxygen][MOLES]/safe_oxygen_max) * 10 - H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) + H.apply_damage_type(CLAMP(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) else H.clear_alert("too_much_oxy") @@ -139,7 +139,7 @@ if(safe_nitro_max) if(N2_pp > safe_nitro_max) var/ratio = (breath_gases[/datum/gas/nitrogen][MOLES]/safe_nitro_max) * 10 - H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) + H.apply_damage_type(CLAMP(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) else H.clear_alert("too_much_nitro") @@ -205,7 +205,7 @@ if(safe_toxins_max) if(Toxins_pp > safe_toxins_max) var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_toxins_max) * 10 - H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) + H.apply_damage_type(CLAMP(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else H.clear_alert("too_much_tox") diff --git a/tgstation.dme b/tgstation.dme index 11399a1b14..3ccdf79ee6 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -54,7 +54,7 @@ #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\maps.dm" -#include "code\__DEFINES\math.dm" +#include "code\__DEFINES\maths.dm" #include "code\__DEFINES\MC.dm" #include "code\__DEFINES\menu.dm" #include "code\__DEFINES\misc.dm" @@ -100,7 +100,6 @@ #include "code\__HELPERS\global_lists.dm" #include "code\__HELPERS\icon_smoothing.dm" #include "code\__HELPERS\icons.dm" -#include "code\__HELPERS\maths.dm" #include "code\__HELPERS\matrices.dm" #include "code\__HELPERS\mobs.dm" #include "code\__HELPERS\names.dm" From 962f135957b8b1ee8ed5b09c30b8595ba540658f Mon Sep 17 00:00:00 2001 From: XDTM Date: Sun, 17 Dec 2017 18:10:25 +0100 Subject: [PATCH 04/97] [Ready]Brain Trauma additions --- code/__DEFINES/misc.dm | 2 +- code/__DEFINES/mobs.dm | 4 +- code/__DEFINES/stat.dm | 6 + code/_onclick/item_attack.dm | 2 + code/_onclick/other_mobs.dm | 1 + code/datums/brain_damage/imaginary_friend.dm | 157 ++++++++++++++++++ code/datums/brain_damage/mild.dm | 79 +++++++++ code/datums/brain_damage/severe.dm | 40 ++++- code/datums/brain_damage/special.dm | 40 +++-- code/datums/brain_damage/split_personality.dm | 3 +- code/datums/martial/psychotic_brawl.dm | 4 +- code/game/objects/items/implants/implant.dm | 3 + .../items/implants/implant_explosive.dm | 9 +- code/modules/flufftext/Hallucination.dm | 1 + code/modules/language/aphasia.dm | 13 ++ code/modules/mob/living/carbon/carbon.dm | 6 + .../modules/mob/living/carbon/damage_procs.dm | 10 +- code/modules/mob/living/carbon/examine.dm | 47 +++--- .../mob/living/carbon/human/examine.dm | 47 +++--- .../mob/living/carbon/human/species.dm | 14 +- .../mob/living/carbon/monkey/combat.dm | 11 +- code/modules/mob/living/life.dm | 3 + code/modules/mob/living/living.dm | 5 +- code/modules/mob/living/living_defense.dm | 57 +++++-- code/modules/surgery/organs/tongue.dm | 3 +- code/modules/surgery/organs/vocal_cords.dm | 17 +- icons/misc/language.dmi | Bin 2383 -> 4323 bytes .../{brain_damage_lines.json => traumas.json} | 55 ++++++ tgstation.dme | 15 ++ 29 files changed, 545 insertions(+), 109 deletions(-) create mode 100644 code/datums/brain_damage/imaginary_friend.dm create mode 100644 code/modules/language/aphasia.dm rename strings/{brain_damage_lines.json => traumas.json} (81%) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6254f12e45..b5d07646d7 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define RIDING_OFFSET_ALL "ALL" //text files -#define BRAIN_DAMAGE_FILE "brain_damage_lines.json" +#define BRAIN_DAMAGE_FILE "traumas.json" //Fullscreen overlay resolution in tiles. #define FULLSCREEN_OVERLAY_RESOLUTION_X 15 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 49e3c996fe..707ef6a9c1 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -52,8 +52,8 @@ /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ //Brain Damage defines -#define BRAIN_DAMAGE_MILD 50 -#define BRAIN_DAMAGE_SEVERE 120 +#define BRAIN_DAMAGE_MILD 20 +#define BRAIN_DAMAGE_SEVERE 100 #define BRAIN_DAMAGE_DEATH 200 #define BRAIN_TRAUMA_MILD /datum/brain_trauma/mild diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 331bc6765f..86f14f8ec0 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -18,8 +18,14 @@ #define HUSK 64 #define NOCLONE 128 #define CLUMSY 256 +<<<<<<< HEAD #define DUMB 512 #define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE +======= +#define DUMB 512 +#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE +#define PACIFISM 2048 +>>>>>>> b5d9845... [Ready]Brain Trauma additions (#33405) // bitflags for machine stat variable #define BROKEN 1 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 859c957a43..11c30bb33e 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -58,6 +58,8 @@ SendSignal(COMSIG_ITEM_ATTACK, M, user) if(flags_1 & NOBLUDGEON_1) return + if(user.disabilities & PACIFISM) + return if(!force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1) else if(hitsound) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 02cdfe7c13..d52a7f6fdc 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -63,6 +63,7 @@ /atom/proc/attack_animal(mob/user) return + /mob/living/RestrainedClickOn(atom/A) return diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm new file mode 100644 index 0000000000..ea01a87506 --- /dev/null +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -0,0 +1,157 @@ +/datum/brain_trauma/special/imaginary_friend + name = "Imaginary Friend" + desc = "Patient can see and hear an imaginary person." + scan_desc = "partial schizophrenia" + gain_text = "You feel in good company, for some reason." + lose_text = "You feel lonely again." + var/mob/camera/imaginary_friend/friend + var/friend_initialized = FALSE + +/datum/brain_trauma/special/imaginary_friend/on_gain() + ..() + make_friend() + get_ghost() + +/datum/brain_trauma/special/imaginary_friend/on_life() + if(get_dist(owner, friend) > 9) + friend.yank() + if(!friend) + qdel(src) + return + if(!friend.client && friend_initialized) + addtimer(CALLBACK(src, .proc/reroll_friend), 600) + +/datum/brain_trauma/special/imaginary_friend/on_lose() + ..() + QDEL_NULL(friend) + +//If the friend goes afk, make a brand new friend. Plenty of fish in the sea of imagination. +/datum/brain_trauma/special/imaginary_friend/proc/reroll_friend() + if(friend.client) //reconnected + return + friend_initialized = FALSE + QDEL_NULL(friend) + make_friend() + get_ghost() + +/datum/brain_trauma/special/imaginary_friend/proc/make_friend() + friend = new(get_turf(src), src) + +/datum/brain_trauma/special/imaginary_friend/proc/get_ghost() + set waitfor = FALSE + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend) + if(LAZYLEN(candidates)) + var/client/C = pick(candidates) + friend.key = C.key + friend_initialized = TRUE + else + qdel(src) + +/mob/camera/imaginary_friend + name = "imaginary friend" + real_name = "imaginary friend" + move_on_shuttle = TRUE + desc = "A wonderful yet fake friend." + see_in_dark = 0 + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sight = NONE + see_invisible = SEE_INVISIBLE_LIVING + var/icon/human_image + var/image/current_image + var/mob/living/carbon/owner + var/datum/brain_trauma/special/imaginary_friend/trauma + +/mob/camera/imaginary_friend/Login() + ..() + to_chat(src, "You are the imaginary friend of [owner]!") + to_chat(src, "You are absolutely loyal to your friend, no matter what.") + to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot.") + +/mob/camera/imaginary_friend/Initialize(mapload, _trauma) + . = ..() + var/gender = pick(MALE, FEMALE) + real_name = random_unique_name(gender) + name = real_name + trauma = _trauma + owner = trauma.owner + human_image = get_flat_human_icon(null, pick(SSjob.occupations)) + Show() + +/mob/camera/imaginary_friend/proc/Show() + if(!client) //nobody home + return + + //Remove old image from owner and friend + if(owner.client) + owner.client.images.Remove(current_image) + + client.images.Remove(current_image) + + //Generate image from the static icon and the current dir + current_image = image(human_image, src, , MOB_LAYER, dir=src.dir) + current_image.override = TRUE + current_image.name = name + + //Add new image to owner and friend + if(owner.client) + owner.client.images |= current_image + + client.images |= current_image + +/mob/camera/imaginary_friend/Destroy() + if(owner.client) + owner.client.images.Remove(human_image) + if(client) + client.images.Remove(human_image) + return ..() + +/mob/camera/imaginary_friend/proc/yank() + if(!client) //don't bother if the friend is braindead + return + forceMove(get_turf(owner)) + Show() + +/mob/camera/imaginary_friend/say(message) + if (!message) + return + + if (src.client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, "You cannot send IC messages (muted).") + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + + friend_talk(message) + +/mob/camera/imaginary_friend/proc/friend_talk(message) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + + if(!message) + return + + log_talk(src,"[key_name(src)] : [message]",LOGSAY) + + var/rendered = "[name] [say_quote(message)]" + var/dead_rendered = "[name] (Imaginary friend of [owner]) [say_quote(message)]" + + to_chat(owner, "[rendered]") + to_chat(src, "[rendered]") + + for(var/mob/M in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(M, owner) + to_chat(M, "[link] [dead_rendered]") + +/mob/camera/imaginary_friend/emote(act,m_type=1,message = null) + return + +/mob/camera/imaginary_friend/forceMove(atom/destination) + dir = get_dir(get_turf(src), destination) + loc = destination + if(get_dist(src, owner) > 9) + yank() + return + Show() + +/mob/camera/imaginary_friend/movement_delay() + return 2 diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 6bfa149aa7..7c2ba20a62 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -107,6 +107,26 @@ ..() +/datum/brain_trauma/mild/healthy + name = "Anosognosia" + desc = "Patient always feels healthy, regardless of their condition." + scan_desc = "self-awareness deficit" + gain_text = "You feel great!" + lose_text = "You no longer feel perfectly healthy." + +/datum/brain_trauma/mild/healthy/on_gain() + owner.set_screwyhud(SCREWYHUD_HEALTHY) + ..() + +/datum/brain_trauma/mild/healthy/on_life() + owner.set_screwyhud(SCREWYHUD_HEALTHY) //just in case of hallucinations + owner.adjustStaminaLoss(-5) //no pain, no fatigue + ..() + +/datum/brain_trauma/mild/healthy/on_lose() + owner.set_screwyhud(SCREWYHUD_NONE) + ..() + /datum/brain_trauma/mild/muscle_weakness name = "Muscle Weakness" desc = "Patient experiences occasional bouts of muscle weakness." @@ -133,3 +153,62 @@ to_chat(owner, "You feel a sudden weakness in your muscles!") owner.adjustStaminaLoss(50) ..() + +/datum/brain_trauma/mild/muscle_spasms + name = "Muscle Spasms" + desc = "Patient has occasional muscle spasms, causing them to move unintentionally." + scan_desc = "nervous fits" + gain_text = "Your muscles feel oddly faint." + lose_text = "You feel in control of your muscles again." + +/datum/brain_trauma/mild/muscle_spasms/on_life() + if(prob(7)) + switch(rand(1,5)) + if(1) + if(owner.canmove && !isspaceturf(owner.loc)) + to_chat(owner, "Your leg spasms!") + step(owner, pick(GLOB.cardinals)) + if(2) + if(owner.incapacitated()) + return + var/obj/item/I = owner.get_active_held_item() + if(I) + to_chat(owner, "Your fingers spasm!") + log_attack("[key_name(owner)] used [I] due to a Muscle Spasm.") + I.attack_self(owner) + if(3) + var/prev_intent = owner.a_intent + owner.a_intent = INTENT_HARM + + var/range = 1 + if(istype(owner.get_active_held_item(), /obj/item/gun)) //get targets to shoot at + range = 7 + + var/list/mob/living/targets = list() + for(var/mob/M in oview(owner, range)) + if(isliving(M)) + targets += M + if(LAZYLEN(targets)) + to_chat(owner, "Your arm spasms!") + log_attack("[key_name(owner)] attacked someone due to a Muscle Spasm.") //the following attack will log itself + owner.ClickOn(pick(targets)) + owner.a_intent = prev_intent + if(4) + var/prev_intent = owner.a_intent + owner.a_intent = INTENT_HARM + to_chat(owner, "Your arm spasms!") + log_attack("[key_name(owner)] attacked himself to a Muscle Spasm.") + owner.ClickOn(owner) + owner.a_intent = prev_intent + if(5) + if(owner.incapacitated()) + return + var/obj/item/I = owner.get_active_held_item() + var/list/turf/targets = list() + for(var/turf/T in oview(owner, 3)) + targets += T + if(LAZYLEN(targets) && I) + to_chat(owner, "Your arm spasms!") + log_attack("[key_name(owner)] threw [I] due to a Muscle Spasm.") + owner.throw_item(pick(targets)) + ..() \ No newline at end of file diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 08cee65085..ceda917713 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -7,7 +7,7 @@ /datum/brain_trauma/severe/mute name = "Mutism" desc = "Patient is completely unable to speak." - scan_desc = "extensive damage to the brain's language center" + scan_desc = "extensive damage to the brain's speech center" gain_text = "You forget how to speak!" lose_text = "You suddenly remember how to speak." @@ -25,6 +25,29 @@ owner.disabilities &= ~MUTE ..() +/datum/brain_trauma/severe/aphasia + name = "Aphasia" + desc = "Patient is unable to speak or understand any language." + scan_desc = "extensive damage to the brain's language center" + gain_text = "You have trouble forming words in your head..." + lose_text = "You suddenly remember how languages work." + var/datum/language_holder/prev_language + var/datum/language_holder/mob_language + +/datum/brain_trauma/severe/aphasia/on_gain() + mob_language = owner.get_language_holder() + prev_language = mob_language.copy() + mob_language.remove_all_languages() + mob_language.grant_language(/datum/language/aphasia) + ..() + +/datum/brain_trauma/severe/aphasia/on_lose() + mob_language.remove_language(/datum/language/aphasia) + mob_language.copy_known_languages_from(prev_language) //this will also preserve languages learned during the trauma + QDEL_NULL(prev_language) + mob_language = null + ..() + /datum/brain_trauma/severe/blindness name = "Cerebral Blindness" desc = "Patient's brain is no longer connected to its eyes." @@ -177,3 +200,18 @@ /datum/brain_trauma/severe/discoordination/on_lose() owner.disabilities &= ~MONKEYLIKE ..() + +/datum/brain_trauma/severe/pacifism + name = "Traumatic Non-Violence" + desc = "Patient is extremely unwilling to harm others in violent ways." + scan_desc = "pacific syndrome" + gain_text = "You feel oddly peaceful." + lose_text = "You no longer feel compelled to not harm." + +/datum/brain_trauma/severe/pacifism/on_gain() + owner.disabilities |= PACIFISM + ..() + +/datum/brain_trauma/severe/pacifism/on_lose() + owner.disabilities &= ~PACIFISM + ..() \ No newline at end of file diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index ddb8f8e6e6..db0ca60801 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -9,25 +9,35 @@ scan_desc = "god delusion" gain_text = "You feel a higher power inside your mind..." lose_text = "The divine presence leaves your head, no longer interested." - var/next_speech = 0 - var/inspiration = FALSE /datum/brain_trauma/special/godwoken/on_life() ..() - if(!inspiration && world.time > next_speech && prob(4)) - to_chat(owner, "[pick("You feel inspired!","You feel power course through you...","You feel something within you itching to speak...")]") - inspiration = TRUE + if(prob(4)) + if(prob(33) && (owner.IsStun() || owner.IsKnockdown() || owner.IsUnconscious())) + speak("unstun", TRUE) + else if(prob(60) && owner.health <= HEALTH_THRESHOLD_CRIT) + speak("heal", TRUE) + else if(prob(30) && owner.a_intent == INTENT_HARM) + speak("aggressive") + else + speak("neutral", prob(25)) -/datum/brain_trauma/special/godwoken/on_say(message) - if(world.time > next_speech && inspiration) - playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5) - var/cooldown = voice_of_god(message, owner, list("colossus","yell"), 2) - cooldown *= 0.33 - next_speech = world.time + cooldown - inspiration = FALSE - return "" - else - return message +/datum/brain_trauma/special/godwoken/proc/speak(type, include_owner = FALSE) + var/message + switch(type) + if("unstun") + message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_unstun") + if("heal") + message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_heal") + if("neutral") + message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral") + if("aggressive") + message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_aggressive") + else + message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral") + + playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, 1, 5) + voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, FALSE) /datum/brain_trauma/special/bluespace_prophet name = "Bluespace Prophecy" diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index c726b2ecb5..deed1c8406 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -23,7 +23,7 @@ /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", null, null, null, 75, stranger_backseat) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat) if(LAZYLEN(candidates)) var/client/C = pick(candidates) stranger_backseat.key = C.key @@ -136,6 +136,7 @@ /mob/living/split_personality/Login() ..() to_chat(src, "As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.") + to_chat(src, "Do not commit suicide or put the body in a deadly position. Behave like you care about it as much as the owner.") /mob/living/split_personality/say(message) to_chat(src, "You cannot speak, your other self is controlling your body!") diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 0d6a85359d..28f8e9502c 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -44,11 +44,9 @@ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, 1, -1) D.apply_damage(rand(5,10), BRUTE, "head") A.apply_damage(rand(5,10), BRUTE, "head") - if(!istype(A.head,/obj/item/clothing/head/helmet/) && !istype(A.head,/obj/item/clothing/head/hardhat)) - A.adjustBrainLoss(5) if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat)) D.adjustBrainLoss(5) - A.Stun(rand(5,30)) + A.Stun(rand(10,45)) D.Stun(rand(5,30)) if(5,6) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index 7ca82c1236..f5b50542d0 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -14,6 +14,9 @@ /obj/item/implant/proc/trigger(emote, mob/living/carbon/source) return +/obj/item/implant/proc/on_death(emote, mob/living/carbon/source) + return + /obj/item/implant/proc/activate() return diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 8b19bb9d96..0dc22c3d83 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -3,7 +3,7 @@ desc = "And boom goes the weasel." icon_state = "explosive" actions_types = list(/datum/action/item_action/explosive_implant) - // Explosive implant action is always availible. + // Explosive implant action is always available. var/weak = 2 var/medium = 0.8 var/heavy = 0.4 @@ -11,6 +11,9 @@ var/popup = FALSE // is the DOUWANNABLOWUP window open? var/active = FALSE +/obj/item/implant/explosive/on_mob_death(mob/living/L, gibbed) + activate("death") + /obj/item/implant/explosive/get_data() var/dat = {"Implant Specifications:
    Name: Robust Corp RX-78 Employee Management Implant
    @@ -23,10 +26,6 @@ "} return dat -/obj/item/implant/explosive/trigger(emote, mob/source) - if(emote == "deathgasp") - activate("death") - /obj/item/implant/explosive/activate(cause) if(!cause || !imp_in || active) return 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 194edd77b1..92dc109bbc 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -80,6 +80,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( /obj/effect/hallucination invisibility = INVISIBILITY_OBSERVER + anchored = TRUE var/mob/living/carbon/target = null /obj/effect/hallucination/simple diff --git a/code/modules/language/aphasia.dm b/code/modules/language/aphasia.dm new file mode 100644 index 0000000000..91f14f9111 --- /dev/null +++ b/code/modules/language/aphasia.dm @@ -0,0 +1,13 @@ +/datum/language/aphasia + name = "Gibbering" + desc = "It is theorized that any sufficiently brain-damaged person can speak this language." + speech_verb = "garbles" + ask_verb = "mumbles" + whisper_verb = "mutters" + exclaim_verb = "screams incoherently" + flags = LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD + key = "i" + syllables = list("m","n","gh","h","l","s","r","a","e","i","o","u") + space_chance = 20 + default_priority = 10 + icon_state = "aphasia" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e2ae973d43..eacfb28d82 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -157,6 +157,8 @@ if(!throwable_mob.buckled) thrown_thing = throwable_mob stop_pulling() + if(disabilities & PACIFISM) + to_chat(src, "You gently let go of [throwable_mob].") var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) @@ -168,6 +170,10 @@ thrown_thing = I dropItemToGround(I) + if(disabilities & PACIFISM && I.throwforce) + to_chat(src, "You set [I] down gently on the ground.") + return + if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") add_logs(src, thrown_thing, "has thrown") diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index aecf966350..a842cb0209 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -198,7 +198,7 @@ update_stamina() /mob/living/carbon/getBrainLoss() - . = BRAIN_DAMAGE_DEATH + . = 0 var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) . = B.get_brain_damage() @@ -207,6 +207,7 @@ /mob/living/carbon/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH) if(status_flags & GODMODE) return 0 + var/prev_brainloss = getBrainLoss() var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(!B) return @@ -224,6 +225,13 @@ else gain_trauma_type(BRAIN_TRAUMA_SEVERE) + if(prev_brainloss < 40 && brainloss >= 40) + to_chat(src, "You feel lightheaded.") + else if(prev_brainloss < 120 && brainloss >= 120) + to_chat(src, "You feel less in control of your thoughts.") + else if(prev_brainloss < 180 && brainloss >= 180) + to_chat(src, "You can feel your mind flickering on and off...") + /mob/living/carbon/setBrainLoss(amount) var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) if(B) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 8c97bc71a3..b8d9d510fd 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -43,31 +43,32 @@ msg += "" var/temp = getBruteLoss() - if(temp) - if (temp < 25) - msg += "[t_He] [t_has] minor bruising.\n" - else if (temp < 50) - msg += "[t_He] [t_has] moderate bruising!\n" - else - msg += "[t_He] [t_has] severe bruising!\n" + if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy + if(temp) + if (temp < 25) + msg += "[t_He] [t_has] minor bruising.\n" + else if (temp < 50) + msg += "[t_He] [t_has] moderate bruising!\n" + else + msg += "[t_He] [t_has] severe bruising!\n" - temp = getFireLoss() - if(temp) - if (temp < 25) - msg += "[t_He] [t_has] minor burns.\n" - else if (temp < 50) - msg += "[t_He] [t_has] moderate burns!\n" - else - msg += "[t_He] [t_has] severe burns!\n" + temp = getFireLoss() + if(temp) + if (temp < 25) + msg += "[t_He] [t_has] minor burns.\n" + else if (temp < 50) + msg += "[t_He] [t_has] moderate burns!\n" + else + msg += "[t_He] [t_has] severe burns!\n" - temp = getCloneLoss() - if(temp) - if(temp < 25) - msg += "[t_He] [t_is] slightly deformed.\n" - else if (temp < 50) - msg += "[t_He] [t_is] moderately deformed!\n" - else - msg += "[t_He] [t_is] severely deformed!\n" + temp = getCloneLoss() + if(temp) + if(temp < 25) + msg += "[t_He] [t_is] slightly deformed.\n" + else if (temp < 50) + msg += "[t_He] [t_is] moderately deformed!\n" + else + msg += "[t_He] [t_is] severely deformed!\n" if(disabilities & DUMB) msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6ed9291b83..39caec803b 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -187,31 +187,32 @@ else if(l_limbs_missing >= 2 && r_limbs_missing >= 2) msg += "[t_He] [p_do()]n't seem all there.\n" - if(temp) - if(temp < 25) - msg += "[t_He] [t_has] minor bruising.\n" - else if(temp < 50) - msg += "[t_He] [t_has] moderate bruising!\n" - else - msg += "[t_He] [t_has] severe bruising!\n" + if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy + if(temp) + if(temp < 25) + msg += "[t_He] [t_has] minor bruising.\n" + else if(temp < 50) + msg += "[t_He] [t_has] moderate bruising!\n" + else + msg += "[t_He] [t_has] severe bruising!\n" - temp = getFireLoss() - if(temp) - if(temp < 25) - msg += "[t_He] [t_has] minor burns.\n" - else if (temp < 50) - msg += "[t_He] [t_has] moderate burns!\n" - else - msg += "[t_He] [t_has] severe burns!\n" + temp = getFireLoss() + if(temp) + if(temp < 25) + msg += "[t_He] [t_has] minor burns.\n" + else if (temp < 50) + msg += "[t_He] [t_has] moderate burns!\n" + else + msg += "[t_He] [t_has] severe burns!\n" - temp = getCloneLoss() - if(temp) - if(temp < 25) - msg += "[t_He] [t_has] minor cellular damage.\n" - else if(temp < 50) - msg += "[t_He] [t_has] moderate cellular damage!\n" - else - msg += "[t_He] [t_has] severe cellular damage!\n" + temp = getCloneLoss() + if(temp) + if(temp < 25) + msg += "[t_He] [t_has] minor cellular damage.\n" + else if(temp < 50) + msg += "[t_He] [t_has] moderate cellular damage!\n" + else + msg += "[t_He] [t_has] severe cellular damage!\n" if(fire_stacks > 0) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0b02a2c711..dc3ade0fd8 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1315,11 +1315,14 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + if(user.disabilities & PACIFISM) + to_chat(user, "You don't want to harm [target]!") + return FALSE if(target.check_block()) target.visible_message("[target] blocks [user]'s attack!") - return 0 + return FALSE if(attacker_style && attacker_style.harm_act(user,target)) - return 1 + return TRUE else var/atk_verb = user.dna.species.attack_verb @@ -1344,7 +1347,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) playsound(target.loc, user.dna.species.miss_sound, 25, 1, -1) target.visible_message("[user] has attempted to [atk_verb] [target]!",\ "[user] has attempted to [atk_verb] [target]!", null, COMBAT_MESSAGE_RANGE) - return 0 + return FALSE var/armor_block = target.run_armor_check(affecting, "melee") @@ -1511,8 +1514,11 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.confused = max(H.confused, 20) H.adjustBrainLoss(20) H.adjust_blurriness(10) - if(prob(20)) + if(prob(10)) H.gain_trauma(/datum/brain_trauma/mild/concussion) + else + if(!I.is_sharp()) + H.adjustBrainLoss(I.force / 5) if(prob(I.force + ((100 - H.health)/2)) && H != user) var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index d6afdbdbc2..09d00465ee 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -120,16 +120,19 @@ /mob/living/carbon/monkey/proc/should_target(var/mob/living/L) if(L == src) - return 0 + return FALSE + + if(disabilities & PACIFISM) + return FALSE if(enemies[L]) - return 1 + return TRUE // target non-monkey mobs when aggressive, with a small probability of monkey v monkey if(aggressive && (!istype(L, /mob/living/carbon/monkey/) || prob(MONKEY_AGGRESSIVE_MVM_PROB))) - return 1 + return TRUE - return 0 + return FALSE /mob/living/carbon/monkey/proc/handle_combat() // Don't do any AI if inside another mob (devoured) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 0aafef753f..3ae022cdcc 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -137,6 +137,9 @@ eye_blurry = max(eye_blurry-1, 0) if(client && !eye_blurry) clear_fullscreen("blurry") + if(disabilities & PACIFISM && a_intent == INTENT_HARM) + to_chat(src, "You don't feel like harming anybody.") + a_intent_change(INTENT_HELP) /mob/living/proc/update_damage_hud() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f589ecbb20..c6f09fdb2f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -809,9 +809,12 @@ to_chat(src, "You don't have the dexterity to do this!") return /mob/living/proc/can_use_guns(obj/item/G) - if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) + if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") return FALSE + if(disabilities & PACIFISM) + to_chat(src, "You don't want to risk harming anyone!") + return FALSE return TRUE /mob/living/carbon/proc/update_stamina() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f77c65225f..6f639d0016 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -127,14 +127,19 @@ /mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src || anchored || !isturf(user.loc)) - return 0 + return FALSE if(!user.pulling || user.pulling != src) user.start_pulling(src, supress_message) return if(!(status_flags & CANPUSH)) to_chat(user, "[src] can't be grabbed more aggressively!") - return 0 + return FALSE + + if(user.disabilities & PACIFISM) + to_chat(user, "You don't want to risk hurting [src]!") + return FALSE + grippedby(user) //proc to upgrade a simple pull into a more aggressive grab. @@ -188,83 +193,101 @@ M.Feedstop() return // can't attack while eating! + if(disabilities & PACIFISM) + to_chat(M, "You don't want to hurt anyone!") + return FALSE + if (stat != DEAD) add_logs(M, src, "attacked") M.do_attack_animation(src) visible_message("The [M.name] glomps [src]!", \ "The [M.name] glomps [src]!", null, COMBAT_MESSAGE_RANGE) - return 1 + return TRUE /mob/living/attack_animal(mob/living/simple_animal/M) M.face_atom(src) if(M.melee_damage_upper == 0) M.visible_message("\The [M] [M.friendly] [src]!") - return 0 + return FALSE else + if(M.disabilities & PACIFISM) + to_chat(M, "You don't want to hurt anyone!") + return FALSE + if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) M.do_attack_animation(src) visible_message("\The [M] [M.attacktext] [src]!", \ "\The [M] [M.attacktext] [src]!", null, COMBAT_MESSAGE_RANGE) add_logs(M, src, "attacked") - return 1 + return TRUE /mob/living/attack_paw(mob/living/carbon/monkey/M) if(isturf(loc) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return 0 + return FALSE if (M.a_intent == INTENT_HARM) + if(M.disabilities & PACIFISM) + to_chat(M, "You don't want to hurt anyone!") + return FALSE + if(M.is_muzzled() || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) to_chat(M, "You can't bite with your mouth covered!") - return 0 + return FALSE M.do_attack_animation(src, ATTACK_EFFECT_BITE) if (prob(75)) add_logs(M, src, "attacked") playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) visible_message("[M.name] bites [src]!", \ "[M.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) - return 1 + return TRUE else visible_message("[M.name] has attempted to bite [src]!", \ "[M.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE) - return 0 + return FALSE /mob/living/attack_larva(mob/living/carbon/alien/larva/L) switch(L.a_intent) if("help") visible_message("[L.name] rubs its head against [src].") - return 0 + return FALSE else + if(L.disabilities & PACIFISM) + to_chat(L, "You don't want to hurt anyone!") + return + L.do_attack_animation(src) if(prob(90)) add_logs(L, src, "attacked") visible_message("[L.name] bites [src]!", \ "[L.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - return 1 + return TRUE else visible_message("[L.name] has attempted to bite [src]!", \ "[L.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE) - return 0 + return FALSE /mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) switch(M.a_intent) if ("help") visible_message("[M] caresses [src] with its scythe like arm.") - return 0 - + return FALSE if ("grab") grabbedby(M) - return 0 + return FALSE if("harm") + if(M.disabilities & PACIFISM) + to_chat(M, "You don't want to hurt anyone!") + return FALSE M.do_attack_animation(src) - return 1 + return TRUE if("disarm") M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return 1 + return TRUE /mob/living/ex_act(severity, target, origin) if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index a8d6e7840a..ba988f450d 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -15,7 +15,8 @@ /datum/language/monkey, /datum/language/narsie, /datum/language/beachbum, - /datum/language/ratvar + /datum/language/ratvar, + /datum/language/aphasia )) /obj/item/organ/tongue/Initialize(mapload) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 78f258be67..cc0324ab6a 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -119,7 +119,7 @@ ///////////VOICE OF GOD/////////////// ////////////////////////////////////// -/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1) +/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE) var/cooldown = 0 if(!user || !user.can_speak() || user.stat) @@ -139,7 +139,9 @@ message = lowertext(message) var/mob/living/list/listeners = list() for(var/mob/living/L in get_hearers_in_view(8, user)) - if(L.can_hear() && !L.null_rod_check() && L != user && L.stat != DEAD) + if(L.can_hear() && !L.null_rod_check() && L.stat != DEAD) + if(L == user && !include_speaker) + continue if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.ears, /obj/item/clothing/ears/earmuffs)) @@ -209,12 +211,12 @@ var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") var/static/regex/sleep_words = regex("sleep|slumber|rest") - var/static/regex/vomit_words = regex("vomit|throw up") - var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush") + var/static/regex/vomit_words = regex("vomit|throw up|sick") + var/static/regex/silence_words = regex("shut up|silence|be silent|ssh|quiet|hush") var/static/regex/hallucinate_words = regex("see the truth|hallucinate") var/static/regex/wakeup_words = regex("wake up|awaken") - var/static/regex/heal_words = regex("live|heal|survive|mend|heroes never die") - var/static/regex/hurt_words = regex("die|suffer|hurt|pain") + var/static/regex/heal_words = regex("live|heal|survive|mend|life|heroes never die") + var/static/regex/hurt_words = regex("die|suffer|hurt|pain|death") var/static/regex/bleed_words = regex("bleed|there will be blood") var/static/regex/burn_words = regex("burn|ignite") var/static/regex/hot_words = regex("heat|hot|hell") @@ -566,7 +568,8 @@ else cooldown = COOLDOWN_NONE - message_admins("[key_name_admin(user)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") + if(message_admins) + message_admins("[key_name_admin(user)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") log_game("[key_name(user)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].") SSblackbox.record_feedback("tally", "voice_of_god", 1, log_message) diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index f4894c2b90c0d864e1a2a80f2457ed507ebaba17..4e627f16c753a836d5dab75e447ca4f92881a78e 100644 GIT binary patch literal 4323 zcmV<95FGD`P)V=-0C=2@(Xk4HKn#H4*?Wqhd#O;mxfDxr(053^)C=|QBzI`(({~WMm2^ws zrf|fQ%lnctW`YJv!nrhsWl7LLZHkAW zr+xmK7lo)I4DA1C3FZ|=Woc$ly4p}Y=`|}c=(RCgN(u1~vN2kAQahMo?xeBgB3vJ(-4}o^7D>*Dr+yDR%;Ymb6RCt`-n|p9nRi4K` z_oh2Uh#@=!0h*8*F$e-#289K-8xjW)X#~T^6hq1HRCR1H-nwWTR^` zQWaLIb)%>wI4j))l)BkW06`)+p$(FVkcWA8`gQh?+vn!?O?NtRbjbm!y^E;>S z_jkU(-|yVpiQ;y<`LSZ-N{0Y=rpT?tvrz$_Y10fP))f6y)ODi%{sKu@o);_~L&4H9 z-P(;~)L7(pt$az5Bop<=Lw;VK$j{3Y=JP~wI2=NLVqM3>#+43X&+Seyk&U`>P<(j+ zB>}=L$ zXLIc8Ro$kiIo$3pXB*EG;h7@0;;Dqg$1mvwr{;{&`;Bdfk6*%5*_9WR+uoroJ|e3v zWe(9H5UbzlfOXl~Y^|!{PX1_PBOf(3>V30@3}N1oA*{>J zCOj+(|Z*;^* zjg3(&E#*IN$dH&M;t_N>9HOUiklEe{NnWnBF()jXGlqq8y2f_P0ewk&@n9woPmTmLc#=n?r0IGI2pcLBE!}k(9B`tOPTKA?xM@o(+s(>|hufDf5c1ROJ4YiekJG15kGk&5JVq=(azrtPgAsZX zl;npGAI{at3ygT!ym@msB{)j$!oAF+fJPp`x5Q7%!DIm5+yA~|wlhPLK5^m%qeoAr zs;YvVoEg;BokF(9Q-pcN;}JGP?JfD1mKOaJO9@GPnsAib#qCQMh`WBdNN)qU>z9kT zedz+>D76dO))V*teio10=YiF$*9p6QCYLW?hS&G=;kF89uSGxRRy)|>z(;wix6DJLT%gTaHX%w9W#oSYfVUOR)qgRNv_WZ?0X$Gwku zD;!G^MmrVyw(=5QuNOdH$y?`6i~92S_P?(LE`HsOytIo|3FgeX6OX5y!oosj@L($i z1;0=R54KWRSg3eB<;Zh$1B_5rdnKR-XFaamcJejaN_Xt&#i#}m88_og3+ z8{>&$KhZuQUVqG|!Fap9{`@@9mz6g<=STH8+#4sDl@Zqg6Ve*Qh328kgtP_$V9ULS zMDp!#*x_)96-fiQ_P^u5iRxAcC!{rqK;?77mU|C&yIq{~{2R91dkFZNnUK~X%!w`@ zDz`X=@z@ub$MkiMC5!XB*~e-FlLG>k&xz5KZe?=bS^~ai{@}Wu+nn!FQ~6(b_TGmr z_a6S>x}Bh}IpGbR^fpBudyC2~PGKH%(%aN4C!|K+CbzUUv1D<+_&C$Xs*DVlEY24# ztxZuj61oEdmCuPA@7Mr9#qW2})^L&AobORxQHCw|9wyo!B;adiqWwYgw)eb$s@&of z#fKlJWYuy}eE8vBuVCdCr*IZ6i`nNaS{8F2Bcb`J={Ot?F(%W-lpCioxAr1M4Gm1W zaSCHHZ8#hbF+VjuYOKB${`sF?BJHze{K0nGLcimhUpI2)n{yBx3jsGU1o)G7Ot61E z>1~2f-_iiMgpJ=M`;THS6X)!`7Y08?hq zrRIwoF4b!9#A`CgaSR~RHYU@CZM==w9S-r2k+C|J0ZKcQ#}DAv86%mMlTQA;Y*yz_ zWcAN~#_FXG?p^G_YE5Fz0}g)i_>{OLB<*|t`cBh?UZj9gjQ%2JA5S^BjcQ@O<{ zid|W_R+dKDOB_pwH#2Qa{O}mI@izT6_noyhycuzZ0Bqwmn>RCU9E%8{%K?^723iz` z3{<&(l)}|^t-ZEcJC42<0)Y_2m%@KMeL5xyDSdtQB|d!@849sv>~yA6xy31R*Si!d z%5}L*XE=+NK}9*a>s?Ca7N>AJyJWm%alUwM(p>JYtsx1h`J#rgnKlLiMZnL1LBQBd z8#P~OHh0(7@Y^SF*)hm&%sD91Sum@yMqWK8aQmnQX!a-2@By~I0$VxHopcLdz9jFa9y zu>I(fqY?5Iv8zNtEULoJGhe8ZE>k>hRl)ha&aZjHIAr0Nn*vS<-+K$ z;``6T{ZHUTyLlb^yxn44I?3sriOU5m_CfLeS0eLV(a2||>rQqZy^h?71H2c!+?bus zhG(Bv01m!grmVT^?*+ibOdDAfvN(MFk0iHtaPaLi1)!+(Ri*IPj|=YwZ}j_s%n12y zdG)M4G>mO|^#H6rGz@%NU!WfFT}6_Waa!!kf*bDWBDJyo~d3%d{*_-r9ISfW)Yg8K}Nsl)bcR zb-R`DeM`IljgZXxlDKq8Z8Ok(j?2wKL^u?WhgP%qjfmO@BqARVvh4MQJ+JRq3Lknz zuPpaEZV|iQI-vdZ?F%B$cfEB$Q$z%X4?Uu(#XMoAAqj5FtJmc}a$pcbej2XS5(oqm z-@RcU@U1XornaG)F*Bj*h8JJZo%@FS1O0s0TL*OMoBQM#{b|s#MTjMNa|!zW480}< zibCqZ6zZCxt+km@D2V&_uLIzI{>Fr>S+Z)mSiZMJk;mR}mM}jLOv_5|Dw%!2y^dRi zk#sERIl#SMQ5=Ow1mPfrJ0REz;Z6v&Mh)l<`M(so>s<<4oWeOzOMu^oJU|2Cgf?;C z2P}BJIBLiC{?jYI7vc_wU{M7 z)k~2?&>gVdwOy3FQbPUPFJMVhP*s(1I7~x(2-opCib|g2T8o0O%_lb8w1|fe?)_0X zLJxr{lcx%cRmEaaQB_E`S_lS1_yZw=!7x|rnn`Zxp!t6<;ZIR%outNe!1-<4h1C*W zd$XMX64zP%A_TU(wu^s%sRV#Y5K_LLX_px^TC)PkU@EVot3p->o52#0+5Ywth_eS)Hf zAPj>BS?Rc87$mC*e{^;|z4=*@kvX2b7fr|g$4_wFIR{#r5pAt}S$BzL58SJLL;Y3u zyM813lM~eKuI*ymvpev$wWBsXL2})A#1}S%?=&I5O0Yczf9pVe?LIoMQLz;ME!ao0 za@KvkxMY>SvUe|<&c)9^<65NwTAI1|`DXx(n=%bif0c`;PXaLSZ+^m=XP)Rc|8!*m zX#J+0!JSW{h$9453n&&K3_>LwP9hvkqTSa)N4p=N&qr|4So~X0>67?6+PM5hHRFDI zz1}u<^ccRZyTn*P8I{Rc;LEy8)Hl`>@?ZHY(~J)bKwE1&VgE;TCZ(XNVN_Ls5(c3V z4yy!1*V5M6fjfcY-8;>g*{l zf9?Na*v5bbKn-4?BRGI0HB6EvjH-rFR86HKq|z47rPJR@D5O0IiEx;d%%PyE9LLVx zio0O72nIu(t~!lC(9zLBOIr&!WaaR6-B$p7)%5ib!?Fih9(6vd{Oj}iVtxKNtOLVX zlLZ!Qn3RE9DGM`zCS?`LNeUqpLaGHzlFHsArBQnU$Ijh~=bzW;u`PsP;!g*0=E7Ng zfzhN`>zFWZ0`-mcKLE}6(5rwobtp;7HzZktSgZ=Fs%3h=I*TOBAS{YN5y^x?VFH05 z9k)*GHkp0LuBhz({;FSz$&-cx8u<$sFL1%@W5M2+`%e`BSo2t!GI-cPQiqNvB{dam zvX!JH3#vsSm~saLQmk05R+OY9!eK#YM@O%=#0&PmteiR90HBlaZ_rcO+7~_~We^M) zI0Wl8DOi$KlmXLGuF1h-)r1oC2WW3?<+s1v(d#c*u=i!pFFw`%$!bYrlOnY_wm}|R$lY0A)?I}>={{Z(c>`4T_ RSswrZ002ovPDHLkV1j^QUYq~` literal 2383 zcmV-V39$BwP)7rM2Y@oo&Rg0 z|5B9y1x>;HudkPrZ0009300A>IH9b(Z^i||pC|A7DhVgLXp8Xi@q?VbPs zu>b#L*zj<)|3*7L85taFssAhv75C`u06?oM78w!%0suLfUYGd>KAQkKnMaBB1w5EW zDKBT8`v5nSHFVoekNZi9^;?qiTa)unkNZP|?LdI(07kk1M797ztpGlz06d=sK3~AV zz-+MDM4Qhrk;*=o%}!8G?(XjL^6>Wc@%Z=iKqu+`Y!=H=q&-Phk&4JhpE?(p#N z^z`!f_VWDu_S)6p;KSF_kG#y6zU%Am`T6wy`|+9|9 z?e6gK@AvlX_un@7+zI&J2Kd|t<>2Mq!qvt&l))c}BAlC#T)I%8tup!?Z+AC!YIhQ%e=9`xU9OjG;qbXtKPOH;kYB@ydmbkALhLv+q+r8 zwZy)%z`L)#x2m|mPJ&cP5X_k^(W5KYsVds8DB`#z;J7QxxxvS{#l*G2!L-4@vcJ)# zKh&l$*{v+zvn%AfCfvMZ&cMvi!OPIV%gw#X$hgJexJlu;IODl6=e;WCz9-nkt<}iU z)W*=!!_LdQ$ic6?=)+0q!Z_>0Ea$~n+0E70xP8jByvMS=SrP>j00001bW%=J06^y0 zW&i*Hw|Z1qbVOxyV{&P5bZKvH004NLjnd5u!Y~X6@N@eVWxI=lc=I9~vV(hv*v7Tk zkCB#5e0rw?ZxU|_`SFL4)aulpyIwVyPEJVKrKpZ-zu8JLJ5%h^><&^`bb~ExlM57F z$_l|(QW!`1J&@u?5OA%(=7BM>2%-yrWD%4Jh-KNkfV`T40`h5wQsmQgGMGn%J1fUD z>O_%s19+VR%e;F68J0y@PRp-xMbP$_s#V)JpGSECmxG?Rl^i1N000F#NklAmAel z(D|`$ggsLW2JvGV$8n^a`jC$T@PeL9gbo12H9>e7Juyok2tg+UA*=wv>RPZMLqHtk zK{x<mnd2M+$zjL=ghE3BYHDhR1|U0x5I7$W z(GXk-Bt;m>k7NOe@qn`n84jC8bSKbHFOj9MW0L3qu%4EYUIWH`zuzhvKpeeY081Z+ zD9FHGBr6vtfK(C<0$3Nxy2@epD!T!89L_azjFcecd`wOP{Z0)3XUym9!6FfOaQCcV zksyE#M^Du@KoIJ|R*8tZ0LTph`5N^EVgD!=i@DU%c+_S%&YJ+ilv{)Z)+aC_Vd~@2 z2C)G%oD?u->l+&z385(wYmPNRPc&Kj7I96n#YKp)080)A064p~ImXADTfq-XXjw~y z)?()&!XkwFMn?}WBw`RiD|i5ULnCK5aWWl4m2SyqCtqE z0Erk=1>%7y#-n0`7>$b}VsdXKQ*i0q1Qa8wqXVIcEg~)?nOOj`TwvsFqzXI?q|+*Z z3lt!_bj|{9aT_t~I`ifU){I1EbnXFLOhFjN#}ILBH5Dr*Fz=EmndDch7{b8H zd@_~X)KVyt;+zOO44`j7l;Py;W}9baEdYf&x%VDz|P@&lXg)Sw9p5F;l z84NI;#E0#7*m0+wHBH-P*WGqE^@=X(rVOV;O+!R@#6FCYM`y>#dvwTSvZLiu_!oQb zrDtY-bi{a_{bOY12FnLPeimCvC3#2x_T;Bc_6eRC6t2NIYLL4Xm5 z2tgrw;N`Kz;PO430gIkI254GAD-<9EZ9gnm6-5CLU{o;zQNU15KljE`+aL~br40#VQAZ_ywMW}>`x5ikw;BB`j}(OWk=!q7T{x$B-hu4Pj~FN<4-v8q;i?j4+cOj-Fn2ix2P8kdAHu) zlTSJIwBCwGd1Z3nl&MorKjX}4XPxZ{aL)8|&pUr=-{k%aF1*N-0~b&4yX4Z#F2ADx z%B!yS;zH$`Yp=Whh8u6X`IcL6yWInz(tpRDcg>h__dPT3y>Hh24-B7BdGMjxa~_^K zXZ9nH&YJt!;~oG{3_LmSsi&Wr_v~|XpMT*+4}h0me&yBI1_oY#C0C5x7N{Tiy(zyJAnLB*>aTczSv{vV#0D-av;*=GO%002ovPDHLkV1oEs Boa+Dp diff --git a/strings/brain_damage_lines.json b/strings/traumas.json similarity index 81% rename from strings/brain_damage_lines.json rename to strings/traumas.json index 4a28998e2c..db7a226f23 100644 --- a/strings/brain_damage_lines.json +++ b/strings/traumas.json @@ -186,6 +186,7 @@ "", ";", ".h" +<<<<<<< HEAD:strings/brain_damage_lines.json ], "roles": [ @@ -215,4 +216,58 @@ "wizzerd" ] +======= + ], + + "god_foe": [ + "MORTALS", + "HERETICS", + "INSECTS", + "UNBELIEVERS", + "BLASPHEMERS", + "PARASITES", + "WEAKLINGS", + "PEASANTS" + ], + + "god_aggressive": [ + "BEGONE, @pick(god_foe)!", + "DIE, @pick(god_foe)!", + "BLEED, @pick(god_foe)!", + "BURN, @pick(god_foe)!", + "ALL WILL FALL BEFORE ME!", + "ENDLESS SUFFERING AWAITS YOU, @pick(god_foe).", + "DEATH TO @pick(god_foe)!" + ], + + "god_neutral": [ + "STOP", + "HALT.", + "BE SILENT.", + "QUIET", + "SEE THE TRUTH BEFORE YOU, MORTALS.", + "MORTALS, SAY YOUR NAME", + "BEGONE, MORTALS.", + "BE HEALED, MORTALS. I AM FEELING MERCIFUL.", + "DANCE FOR ME, LITTLE MORTALS.", + "YOU. STOP.", + "REST, MORTALS, TOMORROW IS A LONG DAY.", + "YOU MORTALS MAKE ME SICK.", + "HONK..." + ], + + "god_unstun": [ + "GET UP. I HAVE NO TIME TO LOSE.", + "GET UP, PRIEST.", + "GET UP." + ], + + "god_heal": [ + "YOU WILL LIVE TO SEE ANOTHER DAY.", + "YOU SHALL SURVIVE THIS, MY PRIEST.", + "BE HEALED, PRIEST.", + "YOUR LIFE IS IMPORTANT. KEEP IT." + ] + +>>>>>>> b5d9845... [Ready]Brain Trauma additions (#33405):strings/traumas.json } diff --git a/tgstation.dme b/tgstation.dme index 11399a1b14..b9852a55bc 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -334,6 +334,7 @@ #include "code\datums\antagonists\revolution.dm" #include "code\datums\antagonists\wizard.dm" #include "code\datums\brain_damage\brain_trauma.dm" +#include "code\datums\brain_damage\imaginary_friend.dm" #include "code\datums\brain_damage\mild.dm" #include "code\datums\brain_damage\phobia.dm" #include "code\datums\brain_damage\severe.dm" @@ -1622,6 +1623,20 @@ #include "code\modules\jobs\job_types\security.dm" #include "code\modules\jobs\job_types\silicon.dm" #include "code\modules\jobs\map_changes\map_changes.dm" +<<<<<<< HEAD +======= +#include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_carbon.dm" +#include "code\modules\keybindings\bindings_client.dm" +#include "code\modules\keybindings\bindings_human.dm" +#include "code\modules\keybindings\bindings_living.dm" +#include "code\modules\keybindings\bindings_mob.dm" +#include "code\modules\keybindings\bindings_robot.dm" +#include "code\modules\keybindings\focus.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\language\aphasia.dm" +>>>>>>> b5d9845... [Ready]Brain Trauma additions (#33405) #include "code\modules\language\beachbum.dm" #include "code\modules\language\codespeak.dm" #include "code\modules\language\common.dm" From 3d375e0be97c18ca5c42534835bcd6023b6d1f72 Mon Sep 17 00:00:00 2001 From: duncathan salt Date: Sun, 17 Dec 2017 14:37:16 -0600 Subject: [PATCH 05/97] properly disables fusion (#33632) --- code/modules/atmospherics/gasmixtures/reactions.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 5a88c6837e..aabbe089fb 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -184,7 +184,7 @@ //fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. /datum/gas_reaction/fusion - exclude = FALSE + exclude = TRUE priority = 2 name = "Plasmic Fusion" id = "fusion" From 99a173b187be808b3f54e0ddebd1d170494c6c2c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:54:52 -0600 Subject: [PATCH 07/97] Update stat.dm --- code/__DEFINES/stat.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 86f14f8ec0..a23f050c13 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -18,14 +18,9 @@ #define HUSK 64 #define NOCLONE 128 #define CLUMSY 256 -<<<<<<< HEAD -#define DUMB 512 -#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE -======= #define DUMB 512 #define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE #define PACIFISM 2048 ->>>>>>> b5d9845... [Ready]Brain Trauma additions (#33405) // bitflags for machine stat variable #define BROKEN 1 From d4c218ec09ae39a562927d887785ca3e4e702094 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:55:04 -0600 Subject: [PATCH 08/97] Update traumas.json --- strings/traumas.json | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/strings/traumas.json b/strings/traumas.json index db7a226f23..9b14a7b530 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -186,37 +186,6 @@ "", ";", ".h" -<<<<<<< HEAD:strings/brain_damage_lines.json - ], - - "roles": [ - "heds", - "ceptin", - "hop", - "arrdee", - "sek" - ], - - "cargo": [ - "GUNS", - "HATS", - "PIZEH", - "MEMES", - "GLOWY CYSTAL" - - ], - - "s_roles": [ - "ert", - "shadowlig", - "ninja", - "admen", - "mantor", - "bluh daymon", - "wizzerd" - - ] -======= ], "god_foe": [ @@ -268,6 +237,4 @@ "BE HEALED, PRIEST.", "YOUR LIFE IS IMPORTANT. KEEP IT." ] - ->>>>>>> b5d9845... [Ready]Brain Trauma additions (#33405):strings/traumas.json } From 27e0d531c622c412ca1d0829d55e6d6737f21ac0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:55:23 -0600 Subject: [PATCH 09/97] Update tgstation.dme --- tgstation.dme | 3 --- 1 file changed, 3 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index b9852a55bc..d6fb877efa 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1623,8 +1623,6 @@ #include "code\modules\jobs\job_types\security.dm" #include "code\modules\jobs\job_types\silicon.dm" #include "code\modules\jobs\map_changes\map_changes.dm" -<<<<<<< HEAD -======= #include "code\modules\keybindings\bindings_admin.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_carbon.dm" @@ -1636,7 +1634,6 @@ #include "code\modules\keybindings\focus.dm" #include "code\modules\keybindings\setup.dm" #include "code\modules\language\aphasia.dm" ->>>>>>> b5d9845... [Ready]Brain Trauma additions (#33405) #include "code\modules\language\beachbum.dm" #include "code\modules\language\codespeak.dm" #include "code\modules\language\common.dm" From 420bebf36f6325d362740a30202cc3be7abfab55 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:56:29 -0600 Subject: [PATCH 10/97] Update radio.dm --- code/__HELPERS/radio.dm | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 56471142ca..39fe55c67c 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -1,19 +1,3 @@ -<<<<<<< HEAD -// Ensure the frequency is within bounds of what it should be sending/recieving at -/proc/sanitize_frequency(frequency, free = FALSE) - . = round(frequency) - if(free) - . = Clamp(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) - else - . = Clamp(frequency, MIN_FREQ, MAX_FREQ) - if(!(. % 2)) // Ensure the last digit is an odd number - . += 1 - -// Format frequency by moving the decimal. -/proc/format_frequency(frequency) - frequency = text2num(frequency) - return "[round(frequency / 10)].[frequency % 10]" -======= // Ensure the frequency is within bounds of what it should be sending/recieving at /proc/sanitize_frequency(frequency, free = FALSE) . = round(frequency) @@ -28,4 +12,3 @@ /proc/format_frequency(frequency) frequency = text2num(frequency) return "[round(frequency / 10)].[frequency % 10]" ->>>>>>> 25080ff... defines math (#33498) From d384941d5c781bb5f2ae1232efab043e7d530df5 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:56:44 -0600 Subject: [PATCH 11/97] Update robot.dm --- code/_onclick/hud/robot.dm | 280 ------------------------------------- 1 file changed, 280 deletions(-) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index e227968f57..769cdb2244 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,282 +1,3 @@ -<<<<<<< HEAD -/obj/screen/robot - icon = 'icons/mob/screen_cyborg.dmi' - -/obj/screen/robot/module - name = "cyborg module" - icon_state = "nomod" - -/obj/screen/robot/Click() - if(isobserver(usr)) - return 1 - -/obj/screen/robot/module/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - if(R.module.type != /obj/item/robot_module) - R.hud_used.toggle_show_robot_modules() - return 1 - R.pick_module() - -/obj/screen/robot/module1 - name = "module1" - icon_state = "inv1" - -/obj/screen/robot/module1/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_module(1) - -/obj/screen/robot/module2 - name = "module2" - icon_state = "inv2" - -/obj/screen/robot/module2/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_module(2) - -/obj/screen/robot/module3 - name = "module3" - icon_state = "inv3" - -/obj/screen/robot/module3/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_module(3) - -/obj/screen/robot/radio - name = "radio" - icon_state = "radio" - -/obj/screen/robot/radio/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.radio.interact(R) - -/obj/screen/robot/store - name = "store" - icon_state = "store" - -/obj/screen/robot/store/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.uneq_active() - -/obj/screen/robot/lamp - name = "headlamp" - icon_state = "lamp0" - -/obj/screen/robot/lamp/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.control_headlamp() - -/obj/screen/robot/thrusters - name = "ion thrusters" - icon_state = "ionpulse0" - -/obj/screen/robot/thrusters/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_ionpulse() - -/datum/hud/robot - ui_style_icon = 'icons/mob/screen_cyborg.dmi' - -/datum/hud/robot/New(mob/owner, ui_style = 'icons/mob/screen_cyborg.dmi') - ..() - var/mob/living/silicon/robot/mymobR = mymob - var/obj/screen/using - - using = new/obj/screen/language_menu - using.screen_loc = ui_borg_language_menu - static_inventory += using - -//Radio - using = new /obj/screen/robot/radio() - using.screen_loc = ui_borg_radio - static_inventory += using - -//Module select - using = new /obj/screen/robot/module1() - using.screen_loc = ui_inv1 - static_inventory += using - mymobR.inv1 = using - - using = new /obj/screen/robot/module2() - using.screen_loc = ui_inv2 - static_inventory += using - mymobR.inv2 = using - - using = new /obj/screen/robot/module3() - using.screen_loc = ui_inv3 - static_inventory += using - mymobR.inv3 = using - -//End of module select - -//Photography stuff - using = new /obj/screen/ai/image_take() - using.screen_loc = ui_borg_camera - static_inventory += using - - using = new /obj/screen/ai/image_view() - using.screen_loc = ui_borg_album - static_inventory += using - -//Sec/Med HUDs - using = new /obj/screen/ai/sensors() - using.screen_loc = ui_borg_sensor - static_inventory += using - -//Headlamp control - using = new /obj/screen/robot/lamp() - using.screen_loc = ui_borg_lamp - static_inventory += using - mymobR.lamp_button = using - -//Thrusters - using = new /obj/screen/robot/thrusters() - using.screen_loc = ui_borg_thrusters - static_inventory += using - mymobR.thruster_button = using - -//Intent - action_intent = new /obj/screen/act_intent/robot() - action_intent.icon_state = mymob.a_intent - static_inventory += action_intent - -//Health - healths = new /obj/screen/healths/robot() - infodisplay += healths - -//Installed Module - mymobR.hands = new /obj/screen/robot/module() - mymobR.hands.screen_loc = ui_borg_module - static_inventory += mymobR.hands - -//Store - module_store_icon = new /obj/screen/robot/store() - module_store_icon.screen_loc = ui_borg_store - - pull_icon = new /obj/screen/pull() - pull_icon.icon = 'icons/mob/screen_cyborg.dmi' - pull_icon.update_icon(mymob) - pull_icon.screen_loc = ui_borg_pull - hotkeybuttons += pull_icon - - - zone_select = new /obj/screen/zone_sel/robot() - zone_select.update_icon(mymob) - static_inventory += zone_select - - -/datum/hud/proc/toggle_show_robot_modules() - if(!iscyborg(mymob)) - return - - var/mob/living/silicon/robot/R = mymob - - R.shown_robot_modules = !R.shown_robot_modules - update_robot_modules_display() - -/datum/hud/proc/update_robot_modules_display(mob/viewer) - if(!iscyborg(mymob)) - return - - var/mob/living/silicon/robot/R = mymob - - var/mob/screenmob = viewer || R - - if(!R.module) - return - - if(!R.client) - return - - if(R.shown_robot_modules && screenmob.hud_used.hud_shown) - //Modules display is shown - screenmob.client.screen += module_store_icon //"store" icon - - if(!R.module.modules) - to_chat(usr, "Selected module has no modules to select") - return - - if(!R.robot_modules_background) - return - - var/display_rows = Ceiling(length(R.module.get_inactive_modules()) / 8) - R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" - screenmob.client.screen += R.robot_modules_background - - var/x = -4 //Start at CENTER-4,SOUTH+1 - var/y = 1 - - for(var/atom/movable/A in R.module.get_inactive_modules()) - //Module is not currently active - screenmob.client.screen += A - if(x < 0) - A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" - else - A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = ABOVE_HUD_LAYER - A.plane = ABOVE_HUD_PLANE - - x++ - if(x == 4) - x = -4 - y++ - - else - //Modules display is hidden - screenmob.client.screen -= module_store_icon //"store" icon - - for(var/atom/A in R.module.get_inactive_modules()) - //Module is not currently active - screenmob.client.screen -= A - R.shown_robot_modules = 0 - screenmob.client.screen -= R.robot_modules_background - -/mob/living/silicon/robot/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/robot(src) - - -/datum/hud/robot/persistent_inventory_update(mob/viewer) - if(!mymob) - return - var/mob/living/silicon/robot/R = mymob - - var/mob/screenmob = viewer || R - - if(screenmob.hud_used) - if(screenmob.hud_used.hud_shown) - for(var/i in 1 to R.held_items.len) - var/obj/item/I = R.held_items[i] - if(I) - switch(i) - if(1) - I.screen_loc = ui_inv1 - if(2) - I.screen_loc = ui_inv2 - if(3) - I.screen_loc = ui_inv3 - else - return - screenmob.client.screen += I - else - for(var/obj/item/I in R.held_items) - screenmob.client.screen -= I -======= /obj/screen/robot icon = 'icons/mob/screen_cyborg.dmi' @@ -554,4 +275,3 @@ else for(var/obj/item/I in R.held_items) screenmob.client.screen -= I ->>>>>>> 25080ff... defines math (#33498) From f377aa441f83e7f6747bccce81b63dcc9d834b7a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:56:54 -0600 Subject: [PATCH 12/97] Update telecrystalconsoles.dm --- code/game/machinery/computer/telecrystalconsoles.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 6670bfbfa7..c9c8504955 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -154,14 +154,9 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. ..() -<<<<<<< HEAD - var/danger = GLOB.joined_player_list.len - SSticker.mode.syndicates.len - danger = Ceiling(danger, 10) -======= var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) var/danger = GLOB.joined_player_list.len - nukeops.len danger = CEILING(danger, 10) ->>>>>>> 25080ff... defines math (#33498) scaleTC(danger) /obj/machinery/computer/telecrystals/boss/proc/scaleTC(amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc. @@ -229,4 +224,4 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E src.updateUsrDialog() return -#undef NUKESCALINGMODIFIER \ No newline at end of file +#undef NUKESCALINGMODIFIER From 75ccc3b354aa62f4cab120cdcc1045e00be7037b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:57:02 -0600 Subject: [PATCH 13/97] Update anomalies.dm --- code/game/objects/effects/anomalies.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 70a6f1bdba..76fd5e5cbf 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -26,14 +26,8 @@ aSignal = new(src) aSignal.name = "[name] core" aSignal.code = rand(1,100) - -<<<<<<< HEAD - aSignal.frequency = rand(1200, 1599) - if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven! -======= aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) if(ISMULTIPLE(aSignal.frequency, 2))//signaller frequencies are always uneven! ->>>>>>> 25080ff... defines math (#33498) aSignal.frequency++ if(new_lifespan) From 4bf535f808394e30d5923d5a75cec62a24bd8677 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:57:23 -0600 Subject: [PATCH 14/97] Update weldingtool.dm --- code/game/objects/items/tools/weldingtool.dm | 393 ++----------------- 1 file changed, 26 insertions(+), 367 deletions(-) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 415cd02585..6e3fab7212 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD #define WELDER_FUEL_BURN_INTERVAL 13 /obj/item/weldingtool name = "welding tool" @@ -22,7 +21,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) resistance_flags = FIRE_PROOF - materials = list(MAT_METAL=70, MAT_GLASS=30) + materials = list(MAT_METAL=70, MAT_GLASS=30) var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) var/max_fuel = 20 //The max amount of fuel the welder can hold @@ -52,7 +51,7 @@ cut_overlays() if(change_icons) var/ratio = get_fuel() / max_fuel - ratio = Ceiling(ratio*4) * 25 + ratio = CEILING(ratio*4, 1) * 25 add_overlay("[initial(icon_state)][ratio]") update_torch() return @@ -90,18 +89,15 @@ flamethrower_screwdriver(I, user) else if(istype(I, /obj/item/stack/rods)) flamethrower_rods(I, user) - else if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) - var/amountNeeded = max_fuel - get_fuel() - var/obj/item/reagent_containers/container = I - if(length(container.reagents.reagent_list) > 1) - to_chat(user, "[container] has too many chemicals mixed into it. You wouldn't want to put the wrong chemicals into [src].") - return ..() - if(amountNeeded > 0 && container.reagents.has_reagent("welding_fuel")) - container.reagents.trans_id_to(src, "welding_fuel", amountNeeded) - to_chat(user, "You transfer some fuel from [container] to [src].") else - return ..() + . = ..() + update_icon() +/obj/item/weldingtool/proc/explode() + var/turf/T = get_turf(loc) + var/plasmaAmount = reagents.get_reagent_amount("plasma") + dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder + qdel(src) /obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user) if(!istype(H)) @@ -124,7 +120,10 @@ /obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) if(!proximity) return - + if(!status && istype(O, /obj/item/reagent_containers) && O.is_open_container()) + reagents.trans_to(O, reagents.total_volume) + to_chat(user, "You empty [src]'s fuel tank into [O].") + update_icon() if(welding) remove_fuel(1) var/turf/location = get_turf(user) @@ -140,6 +139,9 @@ /obj/item/weldingtool/attack_self(mob/user) + if(src.reagents.has_reagent("plasma")) + message_admins("[key_name_admin(user)] activated a rigged welder.") + explode() switched_on(user) if(welding) set_light(light_intensity) @@ -235,9 +237,11 @@ return status = !status if(status) - to_chat(user, "You resecure [src].") + to_chat(user, "You resecure [src] and close the fuel tank.") + container_type = NONE else - to_chat(user, "[src] can now be attached and modified.") + to_chat(user, "[src] can now be attached, modified, and refuelled.") + container_type = OPENCONTAINER_1 add_fingerprint(user) /obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) @@ -265,7 +269,7 @@ desc = "A slightly larger welder with a larger tank." icon_state = "indwelder" max_fuel = 40 - materials = list(MAT_GLASS=60) + materials = list(MAT_GLASS=60) /obj/item/weldingtool/largetank/cyborg name = "integrated welding tool" @@ -295,7 +299,7 @@ icon_state = "welder" toolspeed = 0.1 light_intensity = 0 - change_icons = 0 + change_icons = 0 /obj/item/weldingtool/abductor/process() if(get_fuel() <= max_fuel) @@ -308,7 +312,7 @@ icon_state = "upindwelder" item_state = "upindwelder" max_fuel = 80 - materials = list(MAT_METAL=70, MAT_GLASS=120) + materials = list(MAT_METAL=70, MAT_GLASS=120) /obj/item/weldingtool/experimental name = "experimental welding tool" @@ -316,7 +320,7 @@ icon_state = "exwelder" item_state = "exwelder" max_fuel = 40 - materials = list(MAT_METAL=70, MAT_GLASS=120) + materials = list(MAT_METAL=70, MAT_GLASS=120) var/last_gen = 0 change_icons = 0 can_off_process = 1 @@ -337,350 +341,5 @@ if(get_fuel() < max_fuel && nextrefueltick < world.time) nextrefueltick = world.time + 10 reagents.add_reagent("welding_fuel", 1) -======= -#define WELDER_FUEL_BURN_INTERVAL 13 -/obj/item/weldingtool - name = "welding tool" - desc = "A standard edition welder provided by Nanotrasen." - icon = 'icons/obj/tools.dmi' - icon_state = "welder" - item_state = "welder" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - force = 3 - throwforce = 5 - hitsound = "swing_hit" - usesound = 'sound/items/welder.ogg' - var/acti_sound = 'sound/items/welderactivate.ogg' - var/deac_sound = 'sound/items/welderdeactivate.ogg' - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) - resistance_flags = FIRE_PROOF - - materials = list(MAT_METAL=70, MAT_GLASS=30) - var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) - var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) - var/max_fuel = 20 //The max amount of fuel the welder can hold - var/change_icons = 1 - var/can_off_process = 0 - var/light_intensity = 2 //how powerful the emitted light is when used. - var/burned_fuel_for = 0 //when fuel was last removed - heat = 3800 - toolspeed = 1 - -/obj/item/weldingtool/Initialize() - . = ..() - create_reagents(max_fuel) - reagents.add_reagent("welding_fuel", max_fuel) - update_icon() - - -/obj/item/weldingtool/proc/update_torch() - if(welding) - add_overlay("[initial(icon_state)]-on") - item_state = "[initial(item_state)]1" - else - item_state = "[initial(item_state)]" - - -/obj/item/weldingtool/update_icon() - cut_overlays() - if(change_icons) - var/ratio = get_fuel() / max_fuel - ratio = CEILING(ratio*4, 1) * 25 - add_overlay("[initial(icon_state)][ratio]") - update_torch() - return - - -/obj/item/weldingtool/process() - switch(welding) - if(0) - force = 3 - damtype = "brute" - update_icon() - if(!can_off_process) - STOP_PROCESSING(SSobj, src) - return - //Welders left on now use up fuel, but lets not have them run out quite that fast - if(1) - force = 15 - damtype = "fire" - ++burned_fuel_for - if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) - remove_fuel(1) - update_icon() - - //This is to start fires. process() is only called if the welder is on. - open_flame() - - -/obj/item/weldingtool/suicide_act(mob/user) - user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") - return (FIRELOSS) - - -/obj/item/weldingtool/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) - flamethrower_screwdriver(I, user) - else if(istype(I, /obj/item/stack/rods)) - flamethrower_rods(I, user) - else - . = ..() - update_icon() - -/obj/item/weldingtool/proc/explode() - var/turf/T = get_turf(loc) - var/plasmaAmount = reagents.get_reagent_amount("plasma") - dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder - qdel(src) - -/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user) - if(!istype(H)) - return ..() - - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - - if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) - if(src.remove_fuel(1)) - playsound(loc, usesound, 50, 1) - if(user == H) - user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") - if(!do_mob(user, H, 50)) - return - item_heal_robotic(H, user, 15, 0) - else - return ..() - - -/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) - if(!proximity) - return - if(!status && istype(O, /obj/item/reagent_containers) && O.is_open_container()) - reagents.trans_to(O, reagents.total_volume) - to_chat(user, "You empty [src]'s fuel tank into [O].") - update_icon() - if(welding) - remove_fuel(1) - var/turf/location = get_turf(user) - location.hotspot_expose(700, 50, 1) - if(get_fuel() <= 0) - set_light(0) - - if(isliving(O)) - var/mob/living/L = O - if(L.IgniteMob()) - message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire") - log_game("[key_name(user)] set [key_name(L)] on fire") - - -/obj/item/weldingtool/attack_self(mob/user) - if(src.reagents.has_reagent("plasma")) - message_admins("[key_name_admin(user)] activated a rigged welder.") - explode() - switched_on(user) - if(welding) - set_light(light_intensity) - - update_icon() - - -//Returns the amount of fuel in the welder -/obj/item/weldingtool/proc/get_fuel() - return reagents.get_reagent_amount("welding_fuel") - - -//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() -/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) - if(!welding || !check_fuel()) - return 0 - if(amount) - burned_fuel_for = 0 - if(get_fuel() >= amount) - reagents.remove_reagent("welding_fuel", amount) - check_fuel() - if(M) - M.flash_act(light_intensity) - return TRUE - else - if(M) - to_chat(M, "You need more welding fuel to complete this task!") - return FALSE - - -//Turns off the welder if there is no more fuel (does this really need to be its own proc?) -/obj/item/weldingtool/proc/check_fuel(mob/user) - if(get_fuel() <= 0 && welding) - switched_on(user) - update_icon() - //mob icon update - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands(0) - - return 0 - return 1 - -//Switches the welder on -/obj/item/weldingtool/proc/switched_on(mob/user) - if(!status) - to_chat(user, "[src] can't be turned on while unsecured!") - return - welding = !welding - if(welding) - if(get_fuel() >= 1) - to_chat(user, "You switch [src] on.") - playsound(loc, acti_sound, 50, 1) - force = 15 - damtype = "fire" - hitsound = 'sound/items/welder.ogg' - update_icon() - START_PROCESSING(SSobj, src) - else - to_chat(user, "You need more fuel!") - switched_off(user) - else - to_chat(user, "You switch [src] off.") - playsound(loc, deac_sound, 50, 1) - switched_off(user) - -//Switches the welder off -/obj/item/weldingtool/proc/switched_off(mob/user) - welding = 0 - set_light(0) - - force = 3 - damtype = "brute" - hitsound = "swing_hit" - update_icon() - - -/obj/item/weldingtool/examine(mob/user) - ..() - to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") - -/obj/item/weldingtool/is_hot() - return welding * heat - -//Returns whether or not the welding tool is currently on. -/obj/item/weldingtool/proc/isOn() - return welding - - -/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) - if(welding) - to_chat(user, "Turn it off first!") - return - status = !status - if(status) - to_chat(user, "You resecure [src] and close the fuel tank.") - container_type = NONE - else - to_chat(user, "[src] can now be attached, modified, and refuelled.") - container_type = OPENCONTAINER_1 - add_fingerprint(user) - -/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) - if(!status) - var/obj/item/stack/rods/R = I - if (R.use(1)) - var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc) - if(!remove_item_from_storage(F)) - user.transferItemToLoc(src, F, TRUE) - F.weldtool = src - add_fingerprint(user) - to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") - user.put_in_hands(F) - else - to_chat(user, "You need one rod to start building a flamethrower!") - -/obj/item/weldingtool/ignition_effect(atom/A, mob/user) - if(welding && remove_fuel(1, user)) - . = "[user] casually lights [A] with [src], what a badass." - else - . = "" - -/obj/item/weldingtool/largetank - name = "industrial welding tool" - desc = "A slightly larger welder with a larger tank." - icon_state = "indwelder" - max_fuel = 40 - materials = list(MAT_GLASS=60) - -/obj/item/weldingtool/largetank/cyborg - name = "integrated welding tool" - desc = "An advanced welder designed to be used in robotic systems." - toolspeed = 0.5 - -/obj/item/weldingtool/largetank/flamethrower_screwdriver() - return - - -/obj/item/weldingtool/mini - name = "emergency welding tool" - desc = "A miniature welder used during emergencies." - icon_state = "miniwelder" - max_fuel = 10 - w_class = WEIGHT_CLASS_TINY - materials = list(MAT_METAL=30, MAT_GLASS=10) - change_icons = 0 - -/obj/item/weldingtool/mini/flamethrower_screwdriver() - return - -/obj/item/weldingtool/abductor - name = "alien welding tool" - desc = "An alien welding tool. Whatever fuel it uses, it never runs out." - icon = 'icons/obj/abductor.dmi' - icon_state = "welder" - toolspeed = 0.1 - light_intensity = 0 - change_icons = 0 - -/obj/item/weldingtool/abductor/process() - if(get_fuel() <= max_fuel) - reagents.add_reagent("welding_fuel", 1) - ..() - -/obj/item/weldingtool/hugetank - name = "upgraded industrial welding tool" - desc = "An upgraded welder based of the industrial welder." - icon_state = "upindwelder" - item_state = "upindwelder" - max_fuel = 80 - materials = list(MAT_METAL=70, MAT_GLASS=120) - -/obj/item/weldingtool/experimental - name = "experimental welding tool" - desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." - icon_state = "exwelder" - item_state = "exwelder" - max_fuel = 40 - materials = list(MAT_METAL=70, MAT_GLASS=120) - var/last_gen = 0 - change_icons = 0 - can_off_process = 1 - light_intensity = 1 - toolspeed = 0.5 - var/nextrefueltick = 0 - -/obj/item/weldingtool/experimental/brass - name = "brass welding tool" - desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." - resistance_flags = FIRE_PROOF | ACID_PROOF - icon_state = "brasswelder" - item_state = "brasswelder" - - -/obj/item/weldingtool/experimental/process() - ..() - if(get_fuel() < max_fuel && nextrefueltick < world.time) - nextrefueltick = world.time + 10 - reagents.add_reagent("welding_fuel", 1) - ->>>>>>> 25080ff... defines math (#33498) -#undef WELDER_FUEL_BURN_INTERVAL \ No newline at end of file + +#undef WELDER_FUEL_BURN_INTERVAL From 2771fe55e44a8c9a783f609cd0f9ad1247e15f82 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:57:33 -0600 Subject: [PATCH 15/97] Update pump.dm --- .../machinery/components/binary_devices/pump.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 898a8157ae..9d581fcb78 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -133,14 +133,8 @@ Thus, the two variables affect pump operation are set in New(): pressure = text2num(pressure) . = TRUE if(.) -<<<<<<< HEAD - target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE) - investigate_log("Pump, [src.name], was set to [target_pressure] kPa by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) - message_admins("Pump, [src.name], was set to [target_pressure] kPa by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") -======= target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS) ->>>>>>> 25080ff... defines math (#33498) update_icon() /obj/machinery/atmospherics/components/binary/pump/atmosinit() From 28dfbc7ccc9a4be243dbec512ed6d21676bb24a0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:57:46 -0600 Subject: [PATCH 16/97] Update volume_pump.dm --- .../machinery/components/binary_devices/volume_pump.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index bdc1ae15a3..2803d1bf09 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -133,14 +133,8 @@ Thus, the two variables affect pump operation are set in New(): rate = text2num(rate) . = TRUE if(.) -<<<<<<< HEAD - transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE) - investigate_log("Volume Pump, [src.name], was set to [transfer_rate] L/s by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS) - message_admins("Volume Pump, [src.name], was set to [transfer_rate] L/s by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]") -======= transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE) investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS) ->>>>>>> 25080ff... defines math (#33498) update_icon() /obj/machinery/atmospherics/components/binary/volume_pump/receive_signal(datum/signal/signal) From 2a7b168e0b5520a67752eba35f38941252740384 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:57:57 -0600 Subject: [PATCH 17/97] Update client_procs.dm --- code/modules/client/client_procs.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f356d6c057..411816227f 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -673,8 +673,6 @@ GLOBAL_LIST(external_rsc_urls) return TRUE . = ..() -<<<<<<< HEAD -======= /client/proc/rescale_view(change, min, max) var/viewscale = getviewsize(view) var/x = viewscale[1] @@ -682,7 +680,6 @@ GLOBAL_LIST(external_rsc_urls) x = CLAMP(x+change, min, max) y = CLAMP(y+change, min,max) change_view("[x]x[y]") ->>>>>>> 25080ff... defines math (#33498) /client/proc/change_view(new_size) if (isnull(new_size)) From e6aaad19217abe3e8ac873cf349bdbc940023f71 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 15:58:06 -0600 Subject: [PATCH 18/97] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 1ade939ad3..dbde34d84d 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -18,16 +18,12 @@ announceWhen = rand(15, 30) /datum/round_event/disease_outbreak/start() -<<<<<<< HEAD - if(!virus_type) -======= var/advanced_virus = FALSE max_severity = 3 + max(FLOOR((world.time - control.earliest_start)/6000, 1),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes if(prob(20 + (10 * max_severity))) advanced_virus = TRUE if(!virus_type && !advanced_virus) ->>>>>>> 25080ff... defines math (#33498) virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis) for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) @@ -62,4 +58,4 @@ D = new virus_type() D.carrier = TRUE H.AddDisease(D) - break \ No newline at end of file + break From 80c5bf53400579926c64cdc7c5bba9f87ff64ec8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 17:34:27 -0600 Subject: [PATCH 19/97] Update tgstation.dme --- tgstation.dme | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index d6fb877efa..60e0228790 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1623,16 +1623,6 @@ #include "code\modules\jobs\job_types\security.dm" #include "code\modules\jobs\job_types\silicon.dm" #include "code\modules\jobs\map_changes\map_changes.dm" -#include "code\modules\keybindings\bindings_admin.dm" -#include "code\modules\keybindings\bindings_atom.dm" -#include "code\modules\keybindings\bindings_carbon.dm" -#include "code\modules\keybindings\bindings_client.dm" -#include "code\modules\keybindings\bindings_human.dm" -#include "code\modules\keybindings\bindings_living.dm" -#include "code\modules\keybindings\bindings_mob.dm" -#include "code\modules\keybindings\bindings_robot.dm" -#include "code\modules\keybindings\focus.dm" -#include "code\modules\keybindings\setup.dm" #include "code\modules\language\aphasia.dm" #include "code\modules\language\beachbum.dm" #include "code\modules\language\codespeak.dm" From 9cbe879b511e80947289698394e20a7b4f88d1ce Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 17 Dec 2017 17:47:12 -0600 Subject: [PATCH 20/97] Update comms.dm --- code/controllers/configuration/entries/comms.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm index 70197b6fd4..56cec985f1 100644 --- a/code/controllers/configuration/entries/comms.dm +++ b/code/controllers/configuration/entries/comms.dm @@ -4,11 +4,7 @@ /datum/config_entry/string/comms_key/ValidateAndSet(str_val) return str_val != "default_pwd" && length(str_val) > 6 && ..() -<<<<<<< HEAD -CONFIG_DEF(string/cross_server_address) -======= /datum/config_entry/keyed_string_list/cross_server ->>>>>>> 8c537ea... Adds config inclusion system (#33307) protection = CONFIG_ENTRY_LOCKED /datum/config_entry/string/cross_server_address/ValidateAndSet(str_val) @@ -21,4 +17,4 @@ GLOBAL_VAR_INIT(medals_enabled, TRUE) //will be auto set to false if the game fa /datum/config_entry/string/medal_hub_address /datum/config_entry/string/medal_hub_password - protection = CONFIG_ENTRY_HIDDEN \ No newline at end of file + protection = CONFIG_ENTRY_HIDDEN From 50bd078b433f0d08f963cca697cdc1dcd3ac03c5 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 18 Dec 2017 13:45:38 -0500 Subject: [PATCH 21/97] Merge pull request #33636 from duncathan/max_reqs restores reaction max_reqs checking code --- .../atmospherics/gasmixtures/gas_mixture.dm | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 64d77a27dc..2ebf5bd7d5 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -399,7 +399,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return "" /datum/gas_mixture/react(turf/open/dump_location) - . = 0 + . = NO_REACTION reaction_results = new @@ -423,6 +423,22 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) continue reaction_loop //at this point, all minimum requirements for the reaction are satisfied. + /* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost + PLEASE DO NOT REMOVE THIS CODE. the commenting is here only for a performance increase. + enabling these checks should be as easy as possible and the fact that they are disabled should be as clear as possible + + var/list/max_reqs = reaction.max_requirements.Copy() + if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \ + || (max_reqs["ENER"] && ener > max_reqs["ENER"])) + continue + max_reqs -= "TEMP" + max_reqs -= "ENER" + for(var/id in max_reqs) + if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id]) + continue reaction_loop + //at this point, all requirements for the reaction are satisfied. we can now react() + */ + . |= reaction.react(src, dump_location) if (. & STOP_REACTIONS) break From 8149f52777521e751ee9a6f8a790495f0a520ea5 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 18 Dec 2017 18:55:09 -0800 Subject: [PATCH 23/97] Adds jousting (#33531) --- code/__DEFINES/components.dm | 3 +- code/datums/components/jousting.dm | 81 ++++++++++++++++++++++++++++ code/game/objects/items.dm | 3 +- code/game/objects/items/twohanded.dm | 4 ++ tgstation.dme | 1 + 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 code/datums/components/jousting.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 87c226b839..0b2a3e06d4 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -61,6 +61,8 @@ #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) #define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) +#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) +#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (/mob/dropper) // /obj/item/clothing signals #define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () @@ -77,7 +79,6 @@ #define COMSIG_MACHINE_PROCESS "machine_process" //from machinery subsystem fire(): () #define COMSIG_MACHINE_PROCESS_ATMOS "machine_process_atmos" //from air subsystem process_atmos_machinery(): () - // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm new file mode 100644 index 0000000000..68621e60ec --- /dev/null +++ b/code/datums/components/jousting.dm @@ -0,0 +1,81 @@ +/datum/component/jousting + var/current_direction = NONE + var/max_tile_charge = 5 + var/min_tile_charge = 2 //tiles before this code gets into effect. + var/current_tile_charge = 0 + var/movement_reset_tolerance = 2 //deciseconds + var/unmounted_damage_boost_per_tile = 0 + var/unmounted_knockdown_chance_per_tile = 0 + var/unmounted_knockdown_time = 0 + var/mounted_damage_boost_per_tile = 2 + var/mounted_knockdown_chance_per_tile = 20 + var/mounted_knockdown_time = 20 + var/requires_mob_riding = TRUE //whether this only works if the attacker is riding a mob, rather than anything they can buckle to. + var/requires_mount = TRUE //kinda defeats the point of jousting if you're not mounted but whatever. + var/mob/current_holder + var/datum/component/redirect/listener + var/current_timerid + +/datum/component/jousting/Initialize() + if(!isitem(parent)) + . = COMPONENT_INCOMPATIBLE + stack_trace("Warning: Jousting component incorrectly applied to invalid parent type [parent.type]") + RegisterSignal(COMSIG_ITEM_EQUIPPED, .proc/on_equip) + RegisterSignal(COMSIG_ITEM_DROPPED, .proc/on_drop) + RegisterSignal(COMSIG_ITEM_ATTACK, .proc/on_attack) + +/datum/component/jousting/Destroy() + QDEL_NULL(listener) + return ..() + +/datum/component/jousting/proc/on_equip(mob/user, slot) + QDEL_NULL(listener) + current_holder = user + listener = new(user, COMSIG_MOVABLE_MOVED, CALLBACK(src, .proc/mob_move)) + +/datum/component/jousting/proc/on_drop(mob/user) + QDEL_NULL(listener) + current_holder = null + current_direction = NONE + current_tile_charge = 0 + +/datum/component/jousting/proc/on_attack(mob/living/target, mob/user) + if(user != current_holder) + return + var/current = current_tile_charge + var/obj/item/I = parent + var/target_buckled = target.buckled ? TRUE : FALSE //we don't need the reference of what they're buckled to, just whether they are. + if((requires_mount && ((requires_mob_riding && !ismob(user.buckled)) || (!user.buckled))) || !current_direction || (current_tile_charge < min_tile_charge)) + return + var/turf/target_turf = get_step(user, current_direction) + if(target in range(1, target_turf)) + var/knockdown_chance = (target_buckled? mounted_knockdown_chance_per_tile : unmounted_knockdown_chance_per_tile) * current + var/knockdown_time = (target_buckled? mounted_knockdown_time : unmounted_knockdown_time) + var/damage = (target_buckled? mounted_damage_boost_per_tile : unmounted_damage_boost_per_tile) * current + var/sharp = I.is_sharp() + var/msg + if(damage) + msg += "[user] [sharp? "impales" : "slams into"] [target] [sharp? "on" : "with"] their [parent]" + target.apply_damage(damage, BRUTE, user.zone_selected, 0) + if(prob(knockdown_chance)) + msg += " and knocks [target] [target_buckled? "off of [target.buckled]" : "down"]" + if(target_buckled) + target.buckled.unbuckle_mob(target) + target.Knockdown(knockdown_time) + if(length(msg)) + user.visible_message("[msg]!") + +/datum/component/jousting/proc/mob_move(newloc, dir) + if(!current_holder || (requires_mount && ((requires_mob_riding && !ismob(current_holder.buckled)) || (!current_holder.buckled)))) + return + if(dir != current_direction) + current_tile_charge = 0 + current_direction = dir + if(current_tile_charge < max_tile_charge) + current_tile_charge++ + if(current_timerid) + deltimer(current_timerid) + current_timerid = addtimer(CALLBACK(src, .proc/reset_charge), movement_reset_tolerance, TIMER_STOPPABLE) + +/datum/component/jousting/proc/reset_charge() + current_tile_charge = 0 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a74b246282..d4e5240642 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -286,7 +286,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(!user.put_in_active_hand(src)) dropped(user) - /obj/item/attack_paw(mob/user) if(!user) return @@ -400,6 +399,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return ITALICS | REDUCE_RANGE /obj/item/proc/dropped(mob/user) + SendSignal(COMSIG_ITEM_DROPPED, user) for(var/X in actions) var/datum/action/A = X A.Remove(user) @@ -431,6 +431,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(mob/user, slot) + SendSignal(COMSIG_ITEM_EQUIPPED, user, slot) for(var/X in actions) var/datum/action/A = X if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index c11d41eaa8..58758668c3 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -429,6 +429,10 @@ var/obj/item/grenade/explosive = null var/war_cry = "AAAAARGH!!!" +/obj/item/twohanded/spear/Initialize() + . = ..() + AddComponent(/datum/component/jousting) + /obj/item/twohanded/spear/examine(mob/user) ..() if(explosive) diff --git a/tgstation.dme b/tgstation.dme index 737f7e8274..01dbb29b04 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -345,6 +345,7 @@ #include "code\datums\components\chasm.dm" #include "code\datums\components\decal.dm" #include "code\datums\components\infective.dm" +#include "code\datums\components\jousting.dm" #include "code\datums\components\material_container.dm" #include "code\datums\components\ntnet_interface.dm" #include "code\datums\components\paintable.dm" From ffb04fd0704a729e09c51267a4247e0d9d9be1b1 Mon Sep 17 00:00:00 2001 From: Shadowlight213 Date: Mon, 18 Dec 2017 17:18:45 -1000 Subject: [PATCH 25/97] Removes syndicate door access from Captain's PDA cartridge. (#33635) --- code/game/objects/items/devices/PDA/cart.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index bfcda7d271..1b9e2c0e14 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -180,9 +180,9 @@ /obj/item/cartridge/captain name = "\improper Value-PAK cartridge" - desc = "Now with 350% more value!" //Give the Captain...EVERYTHING! (Except Mime and Clown) + desc = "Now with 350% more value!" //Give the Captain...EVERYTHING! (Except Mime, Clown, and Syndie) icon_state = "cart-c" - access = ~(CART_CLOWN | CART_MIME) + access = ~(CART_CLOWN | CART_MIME | CART_REMOTE_DOOR) bot_access_flags = SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT spam_enabled = 1 From fabfad270fbbef8c751b7313cc55220073386173 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 18 Dec 2017 22:42:25 -0500 Subject: [PATCH 27/97] Callback security and usr (#33599) * Gonna regret writing this one day * tmp -> temp * Make PushUsr() a /world proc * Callbacks now preserve usr * Fixes PushUsr return value * Fixes PushUsr invocations * Update modifyvariables.dm * Use weakrefs in callback user * Further fixes * Whoopsie --- code/__HELPERS/unsorted.dm | 8 ++++++++ code/datums/callback.dm | 20 ++++++++++++++++++++ code/modules/admin/verbs/modifyvariables.dm | 13 ++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 9ec23fa966..0755074dec 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1508,6 +1508,14 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return "\[[url_encode(thing.tag)]\]" return "\ref[input]" +// Makes a call in the context of a different usr +// Use sparingly +/world/proc/PushUsr(mob/M, datum/callback/CB) + var/temp = usr + usr = M + . = CB.Invoke() + usr = temp + //Returns a list of all servants of Ratvar and observers. /proc/servants_and_ghosts() . = list() diff --git a/code/datums/callback.dm b/code/datums/callback.dm index 88d9427301..5566137189 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -48,6 +48,7 @@ var/datum/object = GLOBAL_PROC var/delegate var/list/arguments + var/datum/weakref/user /datum/callback/New(thingtocall, proctocall, ...) if (thingtocall) @@ -55,6 +56,8 @@ delegate = proctocall if (length(args) > 2) arguments = args.Copy(3) + if(usr) + user = WEAKREF(usr) /world/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...) set waitfor = FALSE @@ -70,8 +73,16 @@ call(thingtocall, proctocall)(arglist(calling_arguments)) /datum/callback/proc/Invoke(...) + if(!usr) + var/datum/weakref/W = user + if(W) + var/mob/M = W.resolve() + if(M) + return world.PushUsr(M, src) + if (!object) return + var/list/calling_arguments = arguments if (length(args)) if (length(arguments)) @@ -87,8 +98,17 @@ //copy and pasted because fuck proc overhead /datum/callback/proc/InvokeAsync(...) set waitfor = FALSE + + if(!usr) + var/datum/weakref/W = user + if(W) + var/mob/M = W.resolve() + if(M) + return world.PushUsr(M, src) + if (!object) return + var/list/calling_arguments = arguments if (length(args)) if (length(arguments)) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 3a2e13fdcc..f6e8d93e62 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -213,7 +213,9 @@ GLOBAL_PROTECT(VVpixelmovement) .["class"] = null return .["type"] = type - .["value"] = new type() + var/atom/newguy = new type() + newguy.var_edited = TRUE + .["value"] = newguy if (VV_NEW_DATUM) var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) @@ -221,7 +223,9 @@ GLOBAL_PROTECT(VVpixelmovement) .["class"] = null return .["type"] = type - .["value"] = new type() + var/datum/newguy = new type() + newguy.var_edited = TRUE + .["value"] = newguy if (VV_NEW_TYPE) var/type = current_value @@ -237,7 +241,10 @@ GLOBAL_PROTECT(VVpixelmovement) .["class"] = null return .["type"] = type - .["value"] = new type() + var/datum/newguy = new type() + if(istype(newguy)) + newguy.var_edited = TRUE + .["value"] = newguy if (VV_NEW_LIST) From 4e5671960d7231c1cce1743e5e98cf64621864d8 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 19 Dec 2017 11:56:09 -0200 Subject: [PATCH 29/97] Merge pull request #33651 from coiax/absorb-language Changelings learn languages from people they absorb --- code/game/gamemodes/changeling/powers/absorb.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 4584dc5a67..56003d91eb 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -58,6 +58,8 @@ user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED) if(target.mind)//if the victim has got a mind + // Absorb a lizard, speak Draconic. + user.copy_known_languages_from(target) target.mind.show_memory(user, 0) //I can read your mind, kekeke. Output all their notes. From 65412db421d2f5272aeeff2dc9d8f785c45db919 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 19 Dec 2017 14:34:06 -0500 Subject: [PATCH 31/97] Update game_options.dm --- code/controllers/configuration/entries/game_options.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 4fa6133883..2d96e3c64b 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -243,9 +243,13 @@ value = 14 min_val = 4 -CONFIG_DEF(flag/allow_crew_objectives) -CONFIG_DEF(flag/allow_miscreants) -CONFIG_DEF(flag/allow_extended_miscreants) +//Cit changes - Adds config options for crew objectives and miscreants +/datum/config_entry/flag/allow_crew_objectives + +/datum/config_entry/flag/allow_miscreants + +/datum/config_entry/flag/allow_extended_miscreants +//End of Cit changes /datum/config_entry/number/bombcap/ValidateAndSet(str_val) . = ..() From edbe78cce846c8cefb82b8e17bc7593a36ef85e1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 19 Dec 2017 13:49:34 -0600 Subject: [PATCH 32/97] Automatic changelog generation for PR #4382 [ci skip] --- html/changelogs/AutoChangeLog-pr-4382.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4382.yml diff --git a/html/changelogs/AutoChangeLog-pr-4382.yml b/html/changelogs/AutoChangeLog-pr-4382.yml new file mode 100644 index 0000000000..64568eb274 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4382.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - config: "Added \"$include\" directives to config files. These are recursive. Only config.txt will be default loaded if they are specified inside it" From 30e8b2a12da7c40da4eb64737d4c2ce1c52acd65 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Dec 2017 15:30:19 -0500 Subject: [PATCH 33/97] Merge pull request #33683 from AnturK/getcommandfix Fixes get admin command --- code/game/atoms_movable.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 121ac00f1d..ddb768488a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -516,7 +516,7 @@ . = ..() . -= "Jump to" .["Follow"] = "?_src_=holder;[HrefToken()];adminplayerobservefollow=[REF(src)]" - .["Get"] = "?_src=holder;[HrefToken()];admingetmovable=[REF(src)]" + .["Get"] = "?_src_=holder;[HrefToken()];admingetmovable=[REF(src)]" /atom/movable/proc/ex_check(ex_id) if(!ex_id) From 063854e2d02af928adb3a7ad8ea5e1450b33eb7a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:28:37 -0600 Subject: [PATCH 35/97] Update aphasia.dm --- code/modules/language/aphasia.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/language/aphasia.dm b/code/modules/language/aphasia.dm index 91f14f9111..070a792ecd 100644 --- a/code/modules/language/aphasia.dm +++ b/code/modules/language/aphasia.dm @@ -5,7 +5,7 @@ ask_verb = "mumbles" whisper_verb = "mutters" exclaim_verb = "screams incoherently" - flags = LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD + flags_1 = LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD key = "i" syllables = list("m","n","gh","h","l","s","r","a","e","i","o","u") space_chance = 20 From 678762209a047cfce5b5c66621ea7e13b617b61c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:33:31 -0600 Subject: [PATCH 36/97] Update ticker.dm --- code/controllers/subsystem/ticker.dm | 201 --------------------------- 1 file changed, 201 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f178a1bd24..0f06caa20d 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -398,207 +398,6 @@ SUBSYSTEM_DEF(ticker) var/mob/living/L = I L.notransform = FALSE -<<<<<<< HEAD -/datum/controller/subsystem/ticker/proc/declare_completion() - set waitfor = FALSE - var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED - var/num_survivors = 0 - var/num_escapees = 0 - var/num_shuttle_escapees = 0 - var/list/successfulCrew = list() - var/list/miscreants = list() - - to_chat(world, "


    The round has ended.") - if(LAZYLEN(GLOB.round_end_notifiees)) - send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") - -/* var/nocredits = config.no_credits_round_end - for(var/client/C in GLOB.clients) - if(!C.credits && !nocredits) - C.RollCredits() - C.playtitlemusic(40)*/ - - //Player status report - for(var/i in GLOB.mob_list) - var/mob/Player = i - if(Player.mind && !isnewplayer(Player)) - if(Player.stat != DEAD && !isbrain(Player)) - num_survivors++ - if(station_evacuated) //If the shuttle has already left the station - var/list/area/shuttle_areas - if(SSshuttle && SSshuttle.emergency) - shuttle_areas = SSshuttle.emergency.shuttle_areas - if(!Player.onCentCom() && !Player.onSyndieBase()) - to_chat(Player, "You managed to survive, but were marooned on [station_name()]...") - else - num_escapees++ - to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].") - if(shuttle_areas[get_area(Player)]) - num_shuttle_escapees++ - else - to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].") - else - to_chat(Player, "You did not survive the events on [station_name()]...") - - CHECK_TICK - - //Round statistics report - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) - - to_chat(world, "
    [GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]") - to_chat(world, "
    [GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]") - if(mode.station_was_nuked) - SSticker.news_report = STATION_DESTROYED_NUKE - var/total_players = GLOB.joined_player_list.len - if(total_players) - to_chat(world, "
    [GLOB.TAB]Total Population: [total_players]") - if(station_evacuated) - to_chat(world, "
    [GLOB.TAB]Evacuation Rate: [num_escapees] ([PERCENT(num_escapees/total_players)]%)") - to_chat(world, "
    [GLOB.TAB](on emergency shuttle): [num_shuttle_escapees] ([PERCENT(num_shuttle_escapees/total_players)]%)") - news_report = STATION_EVACUATED - if(SSshuttle.emergency.is_hijacked()) - news_report = SHUTTLE_HIJACK - to_chat(world, "
    [GLOB.TAB]Survival Rate: [num_survivors] ([PERCENT(num_survivors/total_players)]%)") - to_chat(world, "
    ") - - CHECK_TICK - - //Silicon laws report - for (var/i in GLOB.ai_list) - var/mob/living/silicon/ai/aiPlayer = i - if (aiPlayer.stat != DEAD && aiPlayer.mind) - to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the round were:") - aiPlayer.show_laws(1) - else if (aiPlayer.mind) //if the dead ai has a mind, use its key instead - to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws when it was deactivated were:") - aiPlayer.show_laws(1) - - to_chat(world, "Total law changes: [aiPlayer.law_change_counter]") - - if (aiPlayer.connected_robots.len) - var/robolist = "[aiPlayer.real_name]'s minions were: " - for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) - if(robo.mind) - robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" - to_chat(world, "[robolist]") - - CHECK_TICK - - for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs) - if (!robo.connected_ai && robo.mind) - if (robo.stat != DEAD) - to_chat(world, "[robo.name] (Played by: [robo.mind.key]) survived as an AI-less borg! Its laws were:") - else - to_chat(world, "[robo.name] (Played by: [robo.mind.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:") - - if(robo) //How the hell do we lose robo between here and the world messages directly above this? - robo.laws.show_laws(world) - - CHECK_TICK - - mode.declare_completion()//To declare normal completion. - - CHECK_TICK - - //calls auto_declare_completion_* for all modes - for(var/handler in typesof(/datum/game_mode/proc)) - if (findtext("[handler]","auto_declare_completion_")) - call(mode, handler)(force_ending) - - CHECK_TICK - - if(CONFIG_GET(string/cross_server_address)) - send_news_report() - - CHECK_TICK - - //Print a list of antagonists to the server log - var/list/total_antagonists = list() - //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) - var/temprole = Mind.special_role - if(temprole) //if they are an antagonist of some sort. - if(temprole in total_antagonists) //If the role exists already, add the name to it - total_antagonists[temprole] += ", [Mind.name]([Mind.key])" - else - total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob - total_antagonists[temprole] += ": [Mind.name]([Mind.key])" - - CHECK_TICK - - //Now print them all into the log! - log_game("Antagonists at round end were...") - for(var/i in total_antagonists) - log_game("[i]s[total_antagonists[i]].") - - CHECK_TICK - - for(var/datum/mind/crewMind in minds) - if(!crewMind.current || !crewMind.objectives.len) - continue - for(var/datum/objective/miscreant/MO in crewMind.objectives) - miscreants += "[crewMind.current.real_name] (Played by: [crewMind.key])
    Objective: [MO.explanation_text] (Optional)" - for(var/datum/objective/crew/CO in crewMind.objectives) - if(CO.check_completion()) - to_chat(crewMind.current, "
    Your optional objective: [CO.explanation_text] Success!") - successfulCrew += "[crewMind.current.real_name] (Played by: [crewMind.key])
    Objective: [CO.explanation_text] Success! (Optional)" - else - to_chat(crewMind.current, "
    Your optional objective: [CO.explanation_text] Failed.") - - if (successfulCrew.len) - var/completedObjectives = "The following crew members completed their Crew Objectives:
    " - for(var/i in successfulCrew) - completedObjectives += "[i]
    " - to_chat(world, "[completedObjectives]
    ") - else - if(CONFIG_GET(flag/allow_crew_objectives)) - to_chat(world, "Nobody completed their Crew Objectives!
    ") - - CHECK_TICK - - if (miscreants.len) - var/miscreantObjectives = "The following crew members were miscreants:
    " - for(var/i in miscreants) - miscreantObjectives += "[i]
    " - to_chat(world, "[miscreantObjectives]
    ") - - CHECK_TICK - - mode.declare_station_goal_completion() - - CHECK_TICK - //medals, placed far down so that people can actually see the commendations. - if(GLOB.commendations.len) - to_chat(world, "Medal Commendations:") - for (var/com in GLOB.commendations) - to_chat(world, com) - - CHECK_TICK - - //Collects persistence features - if(mode.allow_persistence_save) - SSpersistence.CollectData() - - //stop collecting feedback during grifftime - SSblackbox.Seal() - - sleep(50) - ready_for_reboot = TRUE - standard_reboot() - -/datum/controller/subsystem/ticker/proc/standard_reboot() - if(ready_for_reboot) - if(mode.station_was_nuked) - Reboot("Station destroyed by Nuclear Device.", "nuke") - else - Reboot("Round ended.", "proper completion") - else - CRASH("Attempted standard reboot without ticker roundend completion") - -======= ->>>>>>> 3d81385... Roundend report refactor (#33246) /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m if(selected_tip) From 98d752fe215851f39f7db700dac8248f59651f43 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:34:27 -0600 Subject: [PATCH 37/97] Update traitor_bro.dm --- code/game/gamemodes/brother/traitor_bro.dm | 35 ---------------------- 1 file changed, 35 deletions(-) diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index 34373da5c8..978f871ba2 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -62,41 +62,6 @@ /datum/game_mode/traitor/bros/generate_report() return "It's Syndicate recruiting season. Be alert for potential Syndicate infiltrators, but also watch out for disgruntled employees trying to defect. Unlike Nanotrasen, the Syndicate prides itself in teamwork and will only recruit pairs that share a brotherly trust." -<<<<<<< HEAD -/datum/game_mode/proc/auto_declare_completion_brother() - if(!LAZYLEN(brother_teams)) - return - var/text = "
    The blood brothers were:" - var/teamnumber = 1 - for(var/datum/objective_team/brother_team/team in brother_teams) - if(!team.members.len) - continue - text += "
    Team #[teamnumber++]" - for(var/datum/mind/M in team.members) - text += printplayer(M) - var/win = TRUE - var/objective_count = 1 - for(var/datum/objective/objective in team.objectives) - if(objective.check_completion()) - text += "
    Objective #[objective_count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS")) - else - text += "
    Objective #[objective_count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL")) - if(!(istype(objective, /datum/objective/crew))) - win = FALSE - objective_count++ - if(win) - text += "
    The blood brothers were successful!" - SSblackbox.record_feedback("tally", "brother_success", 1, "SUCCESS") - else - text += "
    The blood brothers have failed!" - SSblackbox.record_feedback("tally", "brother_success", 1, "FAIL") - text += "
    " - to_chat(world, text) - -======= ->>>>>>> 3d81385... Roundend report refactor (#33246) /datum/game_mode/proc/update_brother_icons_added(datum/mind/brother_mind) var/datum/atom_hud/antag/brotherhud = GLOB.huds[ANTAG_HUD_BROTHER] brotherhud.join_hud(brother_mind.current) From cb8c6cd5e2484365c55d6134a384fd513ebdb182 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:34:38 -0600 Subject: [PATCH 38/97] Update changeling.dm --- code/game/gamemodes/changeling/changeling.dm | 44 -------------------- 1 file changed, 44 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 6fc06f7bca..ad76d41d47 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -94,50 +94,6 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th of the Thing being sent to a station in this sector is highly likely. It may be in the guise of any crew member. Trust nobody - suspect everybody. Do not announce this to the crew, \ as paranoia may spread and inhibit workplace efficiency." -<<<<<<< HEAD -/datum/game_mode/proc/auto_declare_completion_changeling() - var/list/changelings = get_antagonists(/datum/antagonist/changeling,TRUE) //Only real lings get a mention - if(changelings.len) - var/text = "
    The changelings were:" - for(var/datum/mind/changeling in changelings) - var/datum/antagonist/changeling/ling = changeling.has_antag_datum(/datum/antagonist/changeling) - var/changelingwin = 1 - if(!changeling.current) - changelingwin = 0 - - text += printplayer(changeling) - - //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. - text += "
    Changeling ID: [ling.changelingID]." - text += "
    Genomes Extracted: [ling.absorbedcount]" - - if(changeling.objectives.len) - var/count = 1 - for(var/datum/objective/objective in changeling.objectives) - if(objective.check_completion()) - text += "
    Objective #[count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "SUCCESS")) - else - text += "
    Objective #[count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "FAIL")) - if(!(istype(objective, /datum/objective/crew))) - changelingwin = 0 - count++ - - if(changelingwin) - text += "
    The changeling was successful!" - SSblackbox.record_feedback("tally", "changeling_success", 1, "SUCCESS") - else - text += "
    The changeling has failed." - SSblackbox.record_feedback("tally", "changeling_success", 1, "FAIL") - text += "
    " - - to_chat(world, text) - - return 1 - -======= ->>>>>>> 3d81385... Roundend report refactor (#33246) /proc/changeling_transform(mob/living/carbon/human/user, datum/changelingprofile/chosen_prof) var/datum/dna/chosen_dna = chosen_prof.dna user.real_name = chosen_prof.name From 61c7080c34e5c5490228a6bc763c444f3ed58bfd Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:34:59 -0600 Subject: [PATCH 39/97] Update game_mode.dm --- code/game/gamemodes/game_mode.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 0c6a8fd1e0..71824c4590 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -450,8 +450,6 @@ /datum/game_mode/proc/OnNukeExplosion(off_station) if(off_station < 2) station_was_nuked = TRUE //Will end the round on next check. -<<<<<<< HEAD -======= //Additional report section in roundend report /datum/game_mode/proc/special_report() @@ -466,4 +464,3 @@ SSticker.news_report = STATION_EVACUATED if(SSshuttle.emergency.is_hijacked()) SSticker.news_report = SHUTTLE_HIJACK ->>>>>>> 3d81385... Roundend report refactor (#33246) From 2d65e0df49aed7715aec38161214e9bb24127913 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:35:29 -0600 Subject: [PATCH 40/97] Update nuclear.dm --- code/game/gamemodes/nuclear/nuclear.dm | 127 ------------------------- 1 file changed, 127 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index c7fc1bfdc8..a6eb199322 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -171,88 +171,6 @@ return FALSE //its a static var btw ..() -<<<<<<< HEAD -/datum/game_mode/nuclear/declare_completion() - var/disk_rescued = 1 - for(var/obj/item/disk/nuclear/D in GLOB.poi_list) - if(!D.onCentCom()) - disk_rescued = 0 - break - var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME) - - if(nuke_off_station == NUKE_SYNDICATE_BASE) - SSticker.mode_result = "loss - syndicate nuked - disk secured" - to_chat(world, "Humiliating Syndicate Defeat") - to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") - - SSticker.news_report = NUKE_SYNDICATE_BASE - - else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - SSticker.mode_result = "win - syndicate nuke" - to_chat(world, "Syndicate Major Victory!") - to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") - - SSticker.news_report = STATION_NUKED - - else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" - to_chat(world, "Total Annihilation") - to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") - - SSticker.news_report = STATION_NUKED - - else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - SSticker.mode_result = "halfwin - blew wrong station" - to_chat(world, "Crew Minor Victory") - to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") - - SSticker.news_report = NUKE_MISS - - else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" - to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") - to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") - - SSticker.news_report = NUKE_MISS - - else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) - SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" - to_chat(world, "Crew Major Victory!") - to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") - - SSticker.news_report = OPERATIVES_KILLED - - else if (disk_rescued) - SSticker.mode_result = "loss - evacuation - disk secured" - to_chat(world, "Crew Major Victory") - to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") - - SSticker.news_report = OPERATIVES_KILLED - - else if (!disk_rescued && are_operatives_dead()) - SSticker.mode_result = "halfwin - evacuation - disk not secured" - to_chat(world, "Neutral Victory!") - to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") - - SSticker.news_report = OPERATIVE_SKIRMISH - - else if (!disk_rescued && crew_evacuated) - SSticker.mode_result = "halfwin - detonation averted" - to_chat(world, "Syndicate Minor Victory!") - to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") - - SSticker.news_report = OPERATIVE_SKIRMISH - - else if (!disk_rescued && !crew_evacuated) - SSticker.mode_result = "halfwin - interrupted" - to_chat(world, "Neutral Victory") - to_chat(world, "Round was mysteriously interrupted!") - - SSticker.news_report = OPERATIVE_SKIRMISH - - ..() - return -======= /datum/game_mode/nuclear/set_round_result() var result = nuke_team.get_result() switch(result) @@ -287,57 +205,12 @@ SSticker.mode_result = "halfwin - interrupted" SSticker.news_report = OPERATIVE_SKIRMISH return ..() ->>>>>>> 3d81385... Roundend report refactor (#33246) /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." -<<<<<<< HEAD -/datum/game_mode/proc/auto_declare_completion_nuclear() - if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) ) - var/text = "
    The syndicate operatives were:" - var/purchases = "" - var/TC_uses = 0 - for(var/datum/mind/syndicate in syndicates) - text += printplayer(syndicate) - for(var/datum/component/uplink/H in GLOB.uplinks) - if(H.purchase_log) - purchases += H.purchase_log.generate_render() - else - stack_trace("WARNING: Uplink with no purchase_log in nuclear mode! Owner: [H.owner]") - text += "
    " - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses == 0 && station_was_nuked && !are_operatives_dead()) - text += "[icon2html('icons/badass.dmi', world, "badass")]" - to_chat(world, text) - return TRUE - - -/proc/nukelastname(mob/M) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. - var/randomname = pick(GLOB.last_names) - var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN) - - if (!newname) - newname = randomname - - else - if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_") - to_chat(M, "That name is reserved.") - return nukelastname(M) - - return capitalize(newname) - -/proc/NukeNameAssign(lastname,list/syndicates) - for(var/datum/mind/synd_mind in syndicates) - var/mob/living/carbon/human/H = synd_mind.current - synd_mind.name = H.dna.species.random_name(H.gender,0,lastname) - synd_mind.current.real_name = synd_mind.name - return - -======= ->>>>>>> 3d81385... Roundend report refactor (#33246) /proc/is_nuclear_operative(mob/M) return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates From a30de42820db062adab30126aee731ffa5e55f7c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:35:45 -0600 Subject: [PATCH 41/97] Update traitor.dm --- code/game/gamemodes/traitor/traitor.dm | 72 -------------------------- 1 file changed, 72 deletions(-) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 468725074d..42c96cb5c0 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -86,78 +86,6 @@ new_antag.should_specialise = TRUE character.add_antag_datum(new_antag) -<<<<<<< HEAD - - -/datum/game_mode/traitor/declare_completion() - ..() - return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder. - - -/datum/game_mode/proc/auto_declare_completion_traitor() - if(traitors.len) - var/text = "
    The [traitor_name]s were:" - for(var/datum/mind/traitor in traitors) - var/traitorwin = TRUE - - text += printplayer(traitor) - - var/TC_uses = 0 - var/uplink_true = FALSE - var/purchases = "" - for(var/datum/component/uplink/H in GLOB.uplinks) - if(H && H.owner && H.owner == traitor.key) - TC_uses += H.spent_telecrystals - uplink_true = TRUE - purchases += H.purchase_log.generate_render(FALSE) - - var/objectives = "" - if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in traitor.objectives) - if(objective.check_completion()) - objectives += "
    Objective #[count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS")) - else - objectives += "
    Objective #[count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL")) - if(!(istype(objective, /datum/objective/crew))) - traitorwin = FALSE - count++ - - if(uplink_true) - text += " (used [TC_uses] TC) [purchases]" - if(TC_uses==0 && traitorwin) - var/static/icon/badass = icon('icons/badass.dmi', "badass") - text += "[icon2html(badass, world)]" - - text += objectives - - var/special_role_text - if(traitor.special_role) - special_role_text = lowertext(traitor.special_role) - else - special_role_text = "antagonist" - - - if(traitorwin) - text += "
    The [special_role_text] was successful!" - SSblackbox.record_feedback("tally", "traitor_success", 1, "SUCCESS") - else - text += "
    The [special_role_text] has failed!" - SSblackbox.record_feedback("tally", "traitor_success", 1, "FAIL") - SEND_SOUND(traitor.current, 'sound/ambience/ambifailure.ogg') - - text += "
    " - - text += "
    The code phrases were: [GLOB.syndicate_code_phrase]
    \ - The code responses were: [GLOB.syndicate_code_response]
    " - to_chat(world, text) - - return TRUE - -======= ->>>>>>> 3d81385... Roundend report refactor (#33246) /datum/game_mode/traitor/generate_report() return "Although more specific threats are commonplace, you should always remain vigilant for Syndicate agents aboard your station. Syndicate communications have implied that many \ Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions." From 7d193a530322b0ea2d3755b5441450d5ff244a8d Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:35:57 -0600 Subject: [PATCH 42/97] Update wizard.dm --- code/game/gamemodes/wizard/wizard.dm | 45 ---------------------------- 1 file changed, 45 deletions(-) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 6dd38e9d58..0d9655ae8e 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -64,54 +64,9 @@ SSticker.mode_result = "loss - wizard killed" SSticker.news_report = WIZARD_KILLED -<<<<<<< HEAD - for(var/datum/mind/wizard in wizards) - - text += "
    [wizard.key] was [wizard.name] (" - if(wizard.current) - if(wizard.current.stat == DEAD) - text += "died" - else - text += "survived" - if(wizard.current.real_name != wizard.name) - text += " as [wizard.current.real_name]" - else - text += "body destroyed" - text += ")" - - var/count = 1 - var/wizardwin = 1 - for(var/datum/objective/objective in wizard.objectives) - if(objective.check_completion()) - text += "
    Objective #[count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "SUCCESS")) - else - text += "
    Objective #[count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" - SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "FAIL")) - if(!(istype(objective, /datum/objective/crew))) - wizardwin = 0 - count++ - - if(wizard.current && wizardwin) - text += "
    The wizard was successful!" - SSblackbox.record_feedback("tally", "wizard_success", 1, "SUCCESS") - else - text += "
    The wizard has failed!" - SSblackbox.record_feedback("tally", "wizard_success", 1, "FAIL") - if(wizard.spell_list.len>0) - text += "
    [wizard.name] used the following spells: " - var/i = 1 - for(var/obj/effect/proc_holder/spell/S in wizard.spell_list) - text += "[S.name]" - if(wizard.spell_list.len > i) - text += ", " - i++ - text += "
    " -======= /datum/game_mode/wizard/special_report() if(finished) return "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" ->>>>>>> 3d81385... Roundend report refactor (#33246) //returns whether the mob is a wizard (or apprentice) /proc/iswizard(mob/living/M) From 5ed003a0f5c80bafe74db8b1746e559ea4f31e00 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 15:36:07 -0600 Subject: [PATCH 43/97] Update client_defines.dm --- code/modules/client/client_defines.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index a7e3b20e7a..10d3866672 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -68,9 +68,6 @@ var/datum/chatOutput/chatOutput -<<<<<<< HEAD -======= var/list/credits //lazy list of all credit object bound to this client var/datum/player_details/player_details //these persist between logins/logouts during the same round. ->>>>>>> 3d81385... Roundend report refactor (#33246) From 16f1a07b9228aceda04f1b875179d8f7a870ccba Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 16:41:09 -0600 Subject: [PATCH 44/97] diseases --- code/modules/events/disease_outbreak.dm | 68 ++++++++++++++++++++----- 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index eb7625e08c..8f8ad97c0e 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -10,22 +10,30 @@ var/virus_type + var/max_severity = 3 -/datum/round_event/disease_outbreak/announce(fake) + +/datum/round_event/disease_outbreak/announce() priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak7.ogg') /datum/round_event/disease_outbreak/setup() announceWhen = rand(15, 30) + /datum/round_event/disease_outbreak/start() - if(!virus_type) + var/advanced_virus = FALSE + max_severity = 3 + max(Floor((world.time - control.earliest_start)/6000),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes + if(prob(20 + (10 * max_severity))) + advanced_virus = TRUE + + if(!virus_type && !advanced_virus) virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis) - for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) + for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) var/turf/T = get_turf(H) if(!T) continue - if(!(T.z in GLOB.station_z_levels)) + if(T.z != ZLEVEL_STATION) continue if(!H.client) continue @@ -41,16 +49,48 @@ continue var/datum/disease/D - if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. - continue - D = new virus_type() - var/datum/disease/dnaspread/DS = D - DS.strain_data["name"] = H.real_name - DS.strain_data["UI"] = H.dna.uni_identity - DS.strain_data["SE"] = H.dna.struc_enzymes + if(!advanced_virus) + if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. + if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. + continue + D = new virus_type() + var/datum/disease/dnaspread/DS = D + DS.strain_data["name"] = H.real_name + DS.strain_data["UI"] = H.dna.uni_identity + DS.strain_data["SE"] = H.dna.struc_enzymes + else + D = new virus_type() else - D = new virus_type() + D = make_virus(max_severity, max_severity) D.carrier = TRUE H.AddDisease(D) - break \ No newline at end of file + + if(advanced_virus) + var/datum/disease/advance/A = D + var/list/name_symptoms = list() //for feedback + for(var/datum/symptom/S in A.symptoms) + name_symptoms += S.name + message_admins("An event has triggered a random advanced virus outbreak on [key_name_admin(H)]! It has these symptoms: [english_list(name_symptoms)]") + log_game("An event has triggered a random advanced virus outbreak on [key_name(H)]! It has these symptoms: [english_list(name_symptoms)]") + break + +/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) + if(max_symptoms > SYMPTOM_LIMIT) + max_symptoms = SYMPTOM_LIMIT + var/datum/disease/advance/A = new(FALSE, null) + A.symptoms = list() + var/list/datum/symptom/possible_symptoms = list() + for(var/symptom in subtypesof(/datum/symptom)) + var/datum/symptom/S = symptom + if(initial(S.level) > max_level) + continue + if(initial(S.level) <= 0) //unobtainable symptoms + continue + possible_symptoms += S + for(var/i in 1 to max_symptoms) + var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) + if(chosen_symptom) + var/datum/symptom/S = new chosen_symptom + A.symptoms += S + A.Refresh() //just in case someone already made and named the same disease + return A From 516db4851fac58836d26a3409150e1dd78ce65b6 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 16:53:21 -0600 Subject: [PATCH 45/97] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 8f8ad97c0e..01f5c007cd 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -29,11 +29,11 @@ if(!virus_type && !advanced_virus) virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis) - for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) + for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) var/turf/T = get_turf(H) if(!T) continue - if(T.z != ZLEVEL_STATION) + if(T.z != ZLEVEL_STATION_PRIMARY) continue if(!H.client) continue From a59b693555456852e0e95915e79eebf238f68980 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 19 Dec 2017 17:01:56 -0600 Subject: [PATCH 46/97] Automatic changelog generation for PR #4458 [ci skip] --- html/changelogs/AutoChangeLog-pr-4458.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4458.yml diff --git a/html/changelogs/AutoChangeLog-pr-4458.yml b/html/changelogs/AutoChangeLog-pr-4458.yml new file mode 100644 index 0000000000..4e51890691 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4458.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - tweak: "The Disease Outbreak event now can generate random advanced viruses, with more symptoms and higher level as round time goes on." From a0a4acbc2c9f8d21b828d27262d7d7cdcaab6b8b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 17:33:55 -0600 Subject: [PATCH 47/97] Update nuclear.dm --- code/game/gamemodes/nuclear/nuclear.dm | 153 +++++-------------------- 1 file changed, 31 insertions(+), 122 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index a6eb199322..f131046cac 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -1,7 +1,3 @@ -/datum/game_mode - var/list/datum/mind/syndicates = list() - var/nukeops_lastname = "" - /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" @@ -18,12 +14,11 @@ Crew: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle." var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! - var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station - var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level var/list/pre_nukeops = list() + var/datum/team/nuclear/nuke_team + /datum/game_mode/nuclear/pre_setup() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) for(var/i = 0, i < n_agents, ++i) @@ -33,120 +28,23 @@ new_op.special_role = "Nuclear Operative" log_game("[new_op.key] (ckey) has been selected as a nuclear operative") return TRUE - -//////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.join_hud(synd_mind.current) - set_antag_hud(synd_mind.current, "synd") - -/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.leave_hud(synd_mind.current) - set_antag_hud(synd_mind.current, null) - //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// /datum/game_mode/nuclear/post_setup() - var/nuke_code = random_nukecode() - var/agent_number = 1 - var/datum/mind/leader = pick(pre_nukeops) - syndicates += pre_nukeops - for(var/i = 1 to pre_nukeops.len) - var/datum/mind/op = pre_nukeops[i] - - forge_syndicate_objectives(op) - greet_syndicate(op) - equip_syndicate(op.current) - - if(nuke_code) - op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - to_chat(op.current, "The nuclear authorization code is: [nuke_code]") - - if(op == leader) - op.current.forceMove(pick(GLOB.nukeop_leader_start)) - prepare_syndicate_leader(op, nuke_code) - else - op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1]) - op.current.real_name = "[syndicate_name()] Operative #[agent_number++]" - - update_synd_icons_added(op) - op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0) - - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list - if(nuke) - nuke.r_code = nuke_code + //Assign leader + var/datum/mind/leader_mind = pre_nukeops[1] + var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(/datum/antagonist/nukeop/leader) + nuke_team = L.nuke_team + //Assign the remaining operatives + for(var/i = 2 to pre_nukeops.len) + var/datum/mind/nuke_mind = pre_nukeops[i] + nuke_mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) return ..() -/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code) - var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - addtimer(CALLBACK(src, .proc/nuketeam_name_assign, synd_mind), 1) - synd_mind.current.real_name = "[syndicate_name()] [leader_title]" - to_chat(synd_mind.current, "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") - to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - - var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge - synd_mind.current.put_in_hands(challenge, TRUE) - - var/static/id_cache = typecacheof(/obj/item/card/id) - var/list/foundIDs = typecache_filter_list(synd_mind.current.GetAllContents(), id_cache) - if(foundIDs.len) - for(var/i in 1 to foundIDs.len) - var/obj/item/card/id/ID = foundIDs[i] - ID.name = "lead agent card" - ID.access += ACCESS_SYNDICATE_LEADER - else - message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!") - - var/obj/item/device/radio/headset/syndicate/alt/A = locate() in synd_mind.current - if(A) - A.command = TRUE - - if(nuke_code) - var/obj/item/paper/P = new - P.info = "The nuclear authorization code is: [nuke_code]" - P.name = "nuclear bomb code" - var/mob/living/carbon/human/H = synd_mind.current - H.put_in_hands(P, TRUE) - H.update_icons() - else - nuke_code = "code will be provided later" - return - -/datum/game_mode/proc/nuketeam_name_assign(datum/mind/synd_mind) - nukeops_lastname = nukelastname(synd_mind.current) - NukeNameAssign(nukeops_lastname, syndicates) - - -/datum/game_mode/proc/forge_syndicate_objectives(datum/mind/syndicate) - var/datum/objective/nuclear/syndobj = new - syndobj.owner = syndicate - syndicate.objectives += syndobj - - -/datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1) - if(you_are) - to_chat(syndicate.current, "You are a [syndicate_name()] agent!") - syndicate.announce_objectives() - -/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE) - synd_mob.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs - - if(telecrystals) - synd_mob.equipOutfit(/datum/outfit/syndicate) - else - synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals) - return TRUE - /datum/game_mode/nuclear/OnNukeExplosion(off_station) ..() nukes_left-- - var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate") - syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1 - nuke_off_station = off_station /datum/game_mode/nuclear/check_win() if (nukes_left == 0) @@ -154,8 +52,8 @@ return ..() /datum/game_mode/proc/are_operatives_dead() - for(var/datum/mind/operative_mind in syndicates) - if(ishuman(operative_mind.current) && (operative_mind.current.stat!=2)) + for(var/datum/mind/operative_mind in get_antagonists(/datum/antagonist/nukeop)) + if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) return FALSE return TRUE @@ -164,7 +62,7 @@ return replacementmode.check_finished() if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) return TRUE - if(are_operatives_dead()) + if(nuke_team.operatives_dead()) var/obj/machinery/nuclearbomb/N pass(N) //suppress unused warning if(N.bomb_set) //snaaaaaaaaaake! It's not over yet! @@ -172,6 +70,7 @@ ..() /datum/game_mode/nuclear/set_round_result() + ..() var result = nuke_team.get_result() switch(result) if(NUKE_RESULT_FLUKE) @@ -204,7 +103,6 @@ else SSticker.mode_result = "halfwin - interrupted" SSticker.news_report = OPERATIVE_SKIRMISH - return ..() /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ @@ -212,7 +110,7 @@ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." /proc/is_nuclear_operative(mob/M) - return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates + return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop) /datum/outfit/syndicate name = "Syndicate Operative - Basic" @@ -225,18 +123,28 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/storage/box/syndie=1) + backpack_contents = list(/obj/item/storage/box/syndie=1,\ + /obj/item/kitchen/knife/combat/survival) var/tc = 25 + var/command_radio = FALSE + + +/datum/outfit/syndicate/leader + name = "Syndicate Leader - Basic" + id = /obj/item/card/id/syndicate/nuke_leader + r_hand = /obj/item/device/nuclear_challenge + command_radio = TRUE /datum/outfit/syndicate/no_crystals tc = 0 - /datum/outfit/syndicate/post_equip(mob/living/carbon/human/H) var/obj/item/device/radio/R = H.ears - R.set_frequency(GLOB.SYND_FREQ) - R.freqlock = 1 + R.set_frequency(FREQ_SYNDICATE) + R.freqlock = TRUE + if(command_radio) + R.command = TRUE if(tc) var/obj/item/device/radio/uplink/nuclear/U = new(H, H.key, tc) @@ -261,4 +169,5 @@ r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ - /obj/item/gun/ballistic/automatic/pistol=1) + /obj/item/gun/ballistic/automatic/pistol=1,\ + /obj/item/kitchen/knife/combat/survival) From 30796ad34230002b0b546160b567a825f1916127 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 17:56:06 -0600 Subject: [PATCH 48/97] Update cit_arousal.dm --- code/citadel/cit_arousal.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm index 0c03ffb399..077824fe9e 100644 --- a/code/citadel/cit_arousal.dm +++ b/code/citadel/cit_arousal.dm @@ -62,14 +62,14 @@ /mob/living/proc/adjustArousalLoss(amount, updating_arousal=1) if(status_flags & GODMODE || !canbearoused) return 0 - arousalloss = Clamp(arousalloss + amount, min_arousal, max_arousal) + arousalloss = CLAMP(arousalloss + amount, min_arousal, max_arousal) if(updating_arousal) updatearousal() /mob/living/proc/setArousalLoss(amount, updating_arousal=1) if(status_flags & GODMODE || !canbearoused) return 0 - arousalloss = Clamp(amount, min_arousal, max_arousal) + arousalloss = CLAMP(amount, min_arousal, max_arousal) if(updating_arousal) updatearousal() From 6c39e94bba650ea321b18f55c4ba7c2f94e6fe4c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 17:56:52 -0600 Subject: [PATCH 49/97] Update observer.dm --- code/modules/mob/dead/observer/observer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 1837024a7f..4ecae3730d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -471,7 +471,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set hidden = TRUE var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT if(input) - client.change_view(Clamp(client.view + input, 7, max_view)) + client.change_view(CLAMP(client.view + input, 7, max_view)) /mob/dead/observer/verb/boo() set category = "Ghost" From 56737f32de54d6af4ec692fffd7734a3c760e9e7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 17:59:55 -0600 Subject: [PATCH 50/97] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 1eae6c7899..01f5c007cd 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -13,7 +13,7 @@ var/max_severity = 3 -/datum/round_event/disease_outbreak/announce(fake) +/datum/round_event/disease_outbreak/announce() priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak7.ogg') /datum/round_event/disease_outbreak/setup() @@ -22,7 +22,7 @@ /datum/round_event/disease_outbreak/start() var/advanced_virus = FALSE - max_severity = 3 + max(FLOOR((world.time - control.earliest_start)/6000, 1),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes + max_severity = 3 + max(Floor((world.time - control.earliest_start)/6000),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes if(prob(20 + (10 * max_severity))) advanced_virus = TRUE @@ -33,7 +33,7 @@ var/turf/T = get_turf(H) if(!T) continue - if(!(T.z in GLOB.station_z_levels)) + if(T.z != ZLEVEL_STATION_PRIMARY) continue if(!H.client) continue @@ -51,7 +51,7 @@ var/datum/disease/D if(!advanced_virus) if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if(!H.dna || (H.has_disability(BLIND))) //A blindness disease would be the worst. + if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. continue D = new virus_type() var/datum/disease/dnaspread/DS = D From f3e031fe2f6ad04345af87c330876751dd22f574 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 18:02:16 -0600 Subject: [PATCH 51/97] Update telecrystalconsoles.dm --- code/game/machinery/computer/telecrystalconsoles.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 08210bf706..66a266ddb3 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -154,8 +154,9 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. ..() - var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) - var/danger = GLOB.joined_player_list.len - nukeops.len + var/danger = GLOB.joined_player_list.len - SSticker.mode.syndicates.len +// var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) +// var/danger = GLOB.joined_player_list.len - nukeops.len danger = CEILING(danger, 10) scaleTC(danger) From 63b1b1df88119d22c3d18bdfb4b4768be80e6b88 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 18:40:20 -0600 Subject: [PATCH 52/97] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 01f5c007cd..8f5c0e50b5 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -22,7 +22,7 @@ /datum/round_event/disease_outbreak/start() var/advanced_virus = FALSE - max_severity = 3 + max(Floor((world.time - control.earliest_start)/6000),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes + max_severity = 3 + max(FLOOR((world.time - control.earliest_start)/6000),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes if(prob(20 + (10 * max_severity))) advanced_virus = TRUE From bcbb4102bfd039f18a334129e293a38c28ecfff9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 18:50:43 -0600 Subject: [PATCH 53/97] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 8f5c0e50b5..d83c966ff6 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -22,7 +22,7 @@ /datum/round_event/disease_outbreak/start() var/advanced_virus = FALSE - max_severity = 3 + max(FLOOR((world.time - control.earliest_start)/6000),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes + max_severity = 3 + max(FLOOR((world.time - control.earliest_start)/6000, 1),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes if(prob(20 + (10 * max_severity))) advanced_virus = TRUE From dfa53390dfda9e4b967d55ef346658b4d34f0f68 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:12:26 -0600 Subject: [PATCH 54/97] Update nuclear.dm --- code/game/gamemodes/nuclear/nuclear.dm | 306 +++++++++++++++++++------ 1 file changed, 242 insertions(+), 64 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index f131046cac..94c372ef23 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -1,3 +1,7 @@ +/datum/game_mode + var/list/datum/mind/syndicates = list() + var/nukeops_lastname = "" + /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" @@ -14,10 +18,11 @@ Crew: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle." var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! - var/list/pre_nukeops = list() - var/datum/team/nuclear/nuke_team + var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! + var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station + var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level + var/list/pre_nukeops = list() /datum/game_mode/nuclear/pre_setup() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) @@ -28,23 +33,120 @@ new_op.special_role = "Nuclear Operative" log_game("[new_op.key] (ckey) has been selected as a nuclear operative") return TRUE + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// +/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.join_hud(synd_mind.current) + set_antag_hud(synd_mind.current, "synd") + +/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.leave_hud(synd_mind.current) + set_antag_hud(synd_mind.current, null) + //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// /datum/game_mode/nuclear/post_setup() - //Assign leader - var/datum/mind/leader_mind = pre_nukeops[1] - var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(/datum/antagonist/nukeop/leader) - nuke_team = L.nuke_team - //Assign the remaining operatives - for(var/i = 2 to pre_nukeops.len) - var/datum/mind/nuke_mind = pre_nukeops[i] - nuke_mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) + var/nuke_code = random_nukecode() + var/agent_number = 1 + var/datum/mind/leader = pick(pre_nukeops) + syndicates += pre_nukeops + for(var/i = 1 to pre_nukeops.len) + var/datum/mind/op = pre_nukeops[i] + + forge_syndicate_objectives(op) + greet_syndicate(op) + equip_syndicate(op.current) + + if(nuke_code) + op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + to_chat(op.current, "The nuclear authorization code is: [nuke_code]") + + if(op == leader) + op.current.forceMove(pick(GLOB.nukeop_leader_start)) + prepare_syndicate_leader(op, nuke_code) + else + op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1]) + op.current.real_name = "[syndicate_name()] Operative #[agent_number++]" + + update_synd_icons_added(op) + op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0) + + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + nuke.r_code = nuke_code return ..() +/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code) + var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") + addtimer(CALLBACK(src, .proc/nuketeam_name_assign, synd_mind), 1) + synd_mind.current.real_name = "[syndicate_name()] [leader_title]" + to_chat(synd_mind.current, "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") + to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") + to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + + var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge + synd_mind.current.put_in_hands(challenge, TRUE) + + var/static/id_cache = typecacheof(/obj/item/card/id) + var/list/foundIDs = typecache_filter_list(synd_mind.current.GetAllContents(), id_cache) + if(foundIDs.len) + for(var/i in 1 to foundIDs.len) + var/obj/item/card/id/ID = foundIDs[i] + ID.name = "lead agent card" + ID.access += ACCESS_SYNDICATE_LEADER + else + message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!") + + var/obj/item/device/radio/headset/syndicate/alt/A = locate() in synd_mind.current + if(A) + A.command = TRUE + + if(nuke_code) + var/obj/item/paper/P = new + P.info = "The nuclear authorization code is: [nuke_code]" + P.name = "nuclear bomb code" + var/mob/living/carbon/human/H = synd_mind.current + H.put_in_hands(P, TRUE) + H.update_icons() + else + nuke_code = "code will be provided later" + return + +/datum/game_mode/proc/nuketeam_name_assign(datum/mind/synd_mind) + nukeops_lastname = nukelastname(synd_mind.current) + NukeNameAssign(nukeops_lastname, syndicates) + + +/datum/game_mode/proc/forge_syndicate_objectives(datum/mind/syndicate) + var/datum/objective/nuclear/syndobj = new + syndobj.owner = syndicate + syndicate.objectives += syndobj + + +/datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1) + if(you_are) + to_chat(syndicate.current, "You are a [syndicate_name()] agent!") + syndicate.announce_objectives() + +/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE) + synd_mob.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs + + if(telecrystals) + synd_mob.equipOutfit(/datum/outfit/syndicate) + else + synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals) + return TRUE + /datum/game_mode/nuclear/OnNukeExplosion(off_station) ..() nukes_left-- + var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate") + syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1 + nuke_off_station = off_station /datum/game_mode/nuclear/check_win() if (nukes_left == 0) @@ -52,8 +154,8 @@ return ..() /datum/game_mode/proc/are_operatives_dead() - for(var/datum/mind/operative_mind in get_antagonists(/datum/antagonist/nukeop)) - if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) + for(var/datum/mind/operative_mind in syndicates) + if(ishuman(operative_mind.current) && (operative_mind.current.stat!=2)) return FALSE return TRUE @@ -62,55 +164,142 @@ return replacementmode.check_finished() if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) return TRUE - if(nuke_team.operatives_dead()) + if(are_operatives_dead()) var/obj/machinery/nuclearbomb/N pass(N) //suppress unused warning if(N.bomb_set) //snaaaaaaaaaake! It's not over yet! return FALSE //its a static var btw ..() -/datum/game_mode/nuclear/set_round_result() +/datum/game_mode/nuclear/declare_completion() + var/disk_rescued = 1 + for(var/obj/item/disk/nuclear/D in GLOB.poi_list) + if(!D.onCentCom()) + disk_rescued = 0 + break + var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME) + + if(nuke_off_station == NUKE_SYNDICATE_BASE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + to_chat(world, "Humiliating Syndicate Defeat") + to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") + + SSticker.news_report = NUKE_SYNDICATE_BASE + + else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) + SSticker.mode_result = "win - syndicate nuke" + to_chat(world, "Syndicate Major Victory!") + to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") + + SSticker.news_report = STATION_NUKED + + else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + to_chat(world, "Total Annihilation") + to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") + + SSticker.news_report = STATION_NUKED + + else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) + SSticker.mode_result = "halfwin - blew wrong station" + to_chat(world, "Crew Minor Victory") + to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") + + SSticker.news_report = NUKE_MISS + + else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") + to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") + + SSticker.news_report = NUKE_MISS + + else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + to_chat(world, "Crew Major Victory!") + to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") + + SSticker.news_report = OPERATIVES_KILLED + + else if (disk_rescued) + SSticker.mode_result = "loss - evacuation - disk secured" + to_chat(world, "Crew Major Victory") + to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") + + SSticker.news_report = OPERATIVES_KILLED + + else if (!disk_rescued && are_operatives_dead()) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + to_chat(world, "Neutral Victory!") + to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") + + SSticker.news_report = OPERATIVE_SKIRMISH + + else if (!disk_rescued && crew_evacuated) + SSticker.mode_result = "halfwin - detonation averted" + to_chat(world, "Syndicate Minor Victory!") + to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") + + SSticker.news_report = OPERATIVE_SKIRMISH + + else if (!disk_rescued && !crew_evacuated) + SSticker.mode_result = "halfwin - interrupted" + to_chat(world, "Neutral Victory") + to_chat(world, "Round was mysteriously interrupted!") + + SSticker.news_report = OPERATIVE_SKIRMISH + ..() - var result = nuke_team.get_result() - switch(result) - if(NUKE_RESULT_FLUKE) - SSticker.mode_result = "loss - syndicate nuked - disk secured" - SSticker.news_report = NUKE_SYNDICATE_BASE - if(NUKE_RESULT_NUKE_WIN) - SSticker.mode_result = "win - syndicate nuke" - SSticker.news_report = STATION_NUKED - if(NUKE_RESULT_NOSURVIVORS) - SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" - SSticker.news_report = STATION_NUKED - if(NUKE_RESULT_WRONG_STATION) - SSticker.mode_result = "halfwin - blew wrong station" - SSticker.news_report = NUKE_MISS - if(NUKE_RESULT_WRONG_STATION_DEAD) - SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" - SSticker.news_report = NUKE_MISS - if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) - SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" - SSticker.news_report = OPERATIVES_KILLED - if(NUKE_RESULT_CREW_WIN) - SSticker.mode_result = "loss - evacuation - disk secured" - SSticker.news_report = OPERATIVES_KILLED - if(NUKE_RESULT_DISK_LOST) - SSticker.mode_result = "halfwin - evacuation - disk not secured" - SSticker.news_report = OPERATIVE_SKIRMISH - if(NUKE_RESULT_DISK_STOLEN) - SSticker.mode_result = "halfwin - detonation averted" - SSticker.news_report = OPERATIVE_SKIRMISH - else - SSticker.mode_result = "halfwin - interrupted" - SSticker.news_report = OPERATIVE_SKIRMISH + return /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." +/datum/game_mode/proc/auto_declare_completion_nuclear() + if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) ) + var/text = "
    The syndicate operatives were:" + var/purchases = "" + var/TC_uses = 0 + for(var/datum/mind/syndicate in syndicates) + text += printplayer(syndicate) + for(var/datum/component/uplink/H in GLOB.uplinks) + if(H.purchase_log) + purchases += H.purchase_log.generate_render() + else + stack_trace("WARNING: Uplink with no purchase_log in nuclear mode! Owner: [H.owner]") + text += "
    " + text += "(Syndicates used [TC_uses] TC) [purchases]" + if(TC_uses == 0 && station_was_nuked && !are_operatives_dead()) + text += "[icon2html('icons/badass.dmi', world, "badass")]" + to_chat(world, text) + return TRUE + + +/proc/nukelastname(mob/M) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. + var/randomname = pick(GLOB.last_names) + var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN) + + if (!newname) + newname = randomname + + else + if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_") + to_chat(M, "That name is reserved.") + return nukelastname(M) + + return capitalize(newname) + +/proc/NukeNameAssign(lastname,list/syndicates) + for(var/datum/mind/synd_mind in syndicates) + var/mob/living/carbon/human/H = synd_mind.current + synd_mind.name = H.dna.species.random_name(H.gender,0,lastname) + synd_mind.current.real_name = synd_mind.name + return + /proc/is_nuclear_operative(mob/M) - return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop) + return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates /datum/outfit/syndicate name = "Syndicate Operative - Basic" @@ -123,28 +312,18 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/kitchen/knife/combat/survival) + backpack_contents = list(/obj/item/storage/box/syndie=1) var/tc = 25 - var/command_radio = FALSE - - -/datum/outfit/syndicate/leader - name = "Syndicate Leader - Basic" - id = /obj/item/card/id/syndicate/nuke_leader - r_hand = /obj/item/device/nuclear_challenge - command_radio = TRUE /datum/outfit/syndicate/no_crystals tc = 0 + /datum/outfit/syndicate/post_equip(mob/living/carbon/human/H) var/obj/item/device/radio/R = H.ears - R.set_frequency(FREQ_SYNDICATE) - R.freqlock = TRUE - if(command_radio) - R.command = TRUE + R.set_frequency(GLOB.SYND_FREQ) + R.freqlock = 1 if(tc) var/obj/item/device/radio/uplink/nuclear/U = new(H, H.key, tc) @@ -169,5 +348,4 @@ r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ - /obj/item/gun/ballistic/automatic/pistol=1,\ - /obj/item/kitchen/knife/combat/survival) + /obj/item/gun/ballistic/automatic/pistol=1) From e6cab75e71c4f7a1b178b2eb3fb55d23315e9005 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:22:03 -0600 Subject: [PATCH 55/97] NukeDatum --- code/__HELPERS/names.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index bfcfd23f50..90205168b5 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -121,9 +121,6 @@ GLOBAL_VAR(command_name) return new_station_name /proc/syndicate_name() - var/static/syndicate_name - if (syndicate_name) - return syndicate_name var/name = "" @@ -146,8 +143,7 @@ GLOBAL_VAR(command_name) else name += pick("-", "*", "") name += pick("Tech", "Sun", "Co", "Tek", "X", "Inc", "Gen", "Star", "Dyne", "Code", "Hive") - - syndicate_name = name + return name From 36b527610684e169b45c8ace5e11c771dd454a31 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:23:16 -0600 Subject: [PATCH 56/97] Create nukeop.dm --- datums/antagonists/nukeop.dm | 320 +++++++++++++++++++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 datums/antagonists/nukeop.dm diff --git a/datums/antagonists/nukeop.dm b/datums/antagonists/nukeop.dm new file mode 100644 index 0000000000..46e1ac3602 --- /dev/null +++ b/datums/antagonists/nukeop.dm @@ -0,0 +1,320 @@ +#define NUKE_RESULT_FLUKE 0 +#define NUKE_RESULT_NUKE_WIN 1 +#define NUKE_RESULT_CREW_WIN 2 +#define NUKE_RESULT_CREW_WIN_SYNDIES_DEAD 3 +#define NUKE_RESULT_DISK_LOST 4 +#define NUKE_RESULT_DISK_STOLEN 5 +#define NUKE_RESULT_NOSURVIVORS 6 +#define NUKE_RESULT_WRONG_STATION 7 +#define NUKE_RESULT_WRONG_STATION_DEAD 8 + +/datum/antagonist/nukeop + name = "Nuclear Operative" + job_rank = ROLE_OPERATIVE + var/datum/objective_team/nuclear/nuke_team + var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. + var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. + var/nukeop_outfit = /datum/outfit/syndicate + +/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.join_hud(M) + set_antag_hud(M, "synd") + +/datum/antagonist/nukeop/proc/update_synd_icons_removed(mob/living/M) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.leave_hud(M) + set_antag_hud(M, null) + +/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + update_synd_icons_added(M) + +/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override) + var/mob/living/M = mob_override || owner.current + update_synd_icons_removed(M) + +/datum/antagonist/nukeop/proc/equip_op() + if(!ishuman(owner.current)) + return + var/mob/living/carbon/human/H = owner.current + + H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs + + H.equipOutfit(nukeop_outfit) + return TRUE + +/datum/antagonist/nukeop/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) + to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!") + owner.announce_objectives() + return + +/datum/antagonist/nukeop/on_gain() + give_alias() + forge_objectives() + . = ..() + equip_op() + memorize_code() + if(send_to_spawnpoint) + move_to_spawnpoint() + +/datum/antagonist/nukeop/get_team() + return nuke_team + +/datum/antagonist/nukeop/proc/assign_nuke() + if(nuke_team && !nuke_team.tracked_nuke) + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + nuke_team.tracked_nuke = nuke + if(nuke.r_code == "ADMIN") + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + else + stack_trace("Syndicate nuke not found during nuke team creation.") + nuke_team.memorized_code = null + +/datum/antagonist/nukeop/proc/give_alias() + if(nuke_team && nuke_team.syndicate_name) + var/number = 1 + number = nuke_team.members.Find(owner) + owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" + +/datum/antagonist/nukeop/proc/memorize_code() + if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) + owner.store_memory("[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]", 0, 0) + to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") + else + to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") + +/datum/antagonist/nukeop/proc/forge_objectives() + if(nuke_team) + owner.objectives |= nuke_team.objectives + +/datum/antagonist/nukeop/proc/move_to_spawnpoint() + var/team_number = 1 + if(nuke_team) + team_number = nuke_team.members.Find(owner) + owner.current.forceMove(GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1]) + +/datum/antagonist/nukeop/leader/move_to_spawnpoint() + owner.current.forceMove(pick(GLOB.nukeop_leader_start)) + +/datum/antagonist/nukeop/create_team(datum/objective_team/nuclear/new_team) + if(!new_team) + if(!always_new_team) + for(var/datum/antagonist/nukeop/N in GLOB.antagonists) + if(N.nuke_team) + nuke_team = N.nuke_team + return + nuke_team = new /datum/objective_team/nuclear + nuke_team.update_objectives() + assign_nuke() //This is bit ugly + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + nuke_team = new_team + +/datum/antagonist/nukeop/leader + name = "Nuclear Operative Leader" + nukeop_outfit = /datum/outfit/syndicate/leader + always_new_team = TRUE + var/title + +/datum/antagonist/nukeop/leader/memorize_code() + ..() + if(nuke_team && nuke_team.memorized_code) + var/obj/item/paper/P = new + P.info = "The nuclear authorization code is: [nuke_team.memorized_code]" + P.name = "nuclear bomb code" + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + P.forceMove(get_turf(H)) + else + H.put_in_hands(P, TRUE) + H.update_icons() + +/datum/antagonist/nukeop/leader/give_alias() + title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") + if(nuke_team && nuke_team.syndicate_name) + owner.current.real_name = "[nuke_team.syndicate_name] [title]" + else + owner.current.real_name = "Syndicate [title]" + +/datum/antagonist/nukeop/leader/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) + to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") + to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") + to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + owner.announce_objectives() + addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) + + +/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() + if(!nuke_team) + return + nuke_team.rename_team(ask_name()) + +/datum/objective_team/nuclear/proc/rename_team(new_name) + syndicate_name = new_name + name = "[syndicate_name] Team" + for(var/I in members) + var/datum/mind/synd_mind = I + var/mob/living/carbon/human/H = synd_mind.current + if(!istype(H)) + continue + var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name) + H.fully_replace_character_name(H.real_name,chosen_name) + +/datum/antagonist/nukeop/leader/proc/ask_name() + var/randomname = pick(GLOB.last_names) + var/newname = stripped_input(owner.current,"You are the nuke operative [title]. Please choose a last name for your family.", "Name change",randomname) + if (!newname) + newname = randomname + else + newname = reject_bad_name(newname) + if(!newname) + newname = randomname + + return capitalize(newname) + +/datum/antagonist/nukeop/lone + name = "Lone Operative" + always_new_team = TRUE + send_to_spawnpoint = FALSE //Handled by event + nukeop_outfit = /datum/outfit/syndicate/full + +/datum/antagonist/nukeop/lone/assign_nuke() + if(nuke_team && !nuke_team.tracked_nuke) + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list + if(nuke) + nuke_team.tracked_nuke = nuke + if(nuke.r_code == "ADMIN") + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + else + stack_trace("Station self destruct ot found during lone op team creation.") + nuke_team.memorized_code = null + +/datum/objective_team/nuclear + var/list/objectives + var/syndicate_name + var/obj/machinery/nuclearbomb/tracked_nuke + var/core_objective = /datum/objective/nuclear + var/memorized_code + +/datum/objective_team/nuclear/New() + ..() + syndicate_name = syndicate_name() + +/datum/objective_team/nuclear/proc/update_objectives() + objectives = list() + if(core_objective) + var/datum/objective/O = new core_objective + O.team = src + objectives += O + return + +/datum/objective_team/nuclear/proc/disk_rescued() + for(var/obj/item/disk/nuclear/D in GLOB.poi_list) + if(!D.onCentCom()) + return FALSE + return TRUE + +/datum/objective_team/nuclear/proc/operatives_dead() + for(var/I in members) + var/datum/mind/operative_mind = I + if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) + return FALSE + return TRUE + +/datum/objective_team/nuclear/proc/syndies_escaped() + var/obj/docking_port/mobile/S = SSshuttle.getShuttle("syndicate") + return (S && (S.z == ZLEVEL_CENTCOM || S.z == ZLEVEL_TRANSIT)) + +/datum/objective_team/nuclear/proc/get_result() + var/evacuation = SSshuttle.emergency.mode == SHUTTLE_ENDGAME + var/disk_rescued = disk_rescued() + var/syndies_didnt_escape = !syndies_escaped() + var/station_was_nuked = SSticker.mode.station_was_nuked + var/nuke_off_station = SSticker.mode.nuke_off_station + + if(nuke_off_station == NUKE_SYNDICATE_BASE) + return NUKE_RESULT_FLUKE + else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) + return NUKE_RESULT_NUKE_WIN + else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) + return NUKE_RESULT_NOSURVIVORS + else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) + return NUKE_RESULT_WRONG_STATION + else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) + return NUKE_RESULT_WRONG_STATION_DEAD + else if ((disk_rescued || evacuation) && operatives_dead()) + return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD + else if (disk_rescued) + return NUKE_RESULT_CREW_WIN + else if (!disk_rescued && operatives_dead()) + return NUKE_RESULT_DISK_LOST + else if (!disk_rescued && evacuation) + return NUKE_RESULT_DISK_STOLEN + else + return //Undefined result + +/datum/objective_team/nuclear/proc/roundend_display() + to_chat(world,"[syndicate_name] Operatives:") + + switch(get_result()) + if(NUKE_RESULT_FLUKE) + to_chat(world, "Humiliating Syndicate Defeat") + to_chat(world, "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") + if(NUKE_RESULT_NUKE_WIN) + to_chat(world, "Syndicate Major Victory!") + to_chat(world, "[syndicate_name] operatives have destroyed [station_name()]!") + if(NUKE_RESULT_NOSURVIVORS) + to_chat(world, "Total Annihilation") + to_chat(world, "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") + if(NUKE_RESULT_WRONG_STATION) + to_chat(world, "Crew Minor Victory") + to_chat(world, "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") + if(NUKE_RESULT_WRONG_STATION_DEAD) + to_chat(world, "[syndicate_name] operatives have earned Darwin Award!") + to_chat(world, "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + to_chat(world, "Crew Major Victory!") + to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name] Operatives") + if(NUKE_RESULT_CREW_WIN) + to_chat(world, "Crew Major Victory") + to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!") + if(NUKE_RESULT_DISK_LOST) + to_chat(world, "Neutral Victory!") + to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!") + if(NUKE_RESULT_DISK_STOLEN) + to_chat(world, "Syndicate Minor Victory!") + to_chat(world, "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") + else + to_chat(world, "Neutral Victory") + to_chat(world, "Mission aborted!") + + var/text = "
    The syndicate operatives were:" + var/purchases = "" + var/TC_uses = 0 + for(var/I in members) + var/datum/mind/syndicate = I + text += SSticker.mode.printplayer(syndicate) //to be moved + for(var/U in GLOB.uplinks) + var/datum/component/uplink/H = U + if(H.owner == syndicate.key) + TC_uses += H.spent_telecrystals + if(H.purchase_log) + purchases += H.purchase_log.generate_render(show_key = FALSE) + else + stack_trace("WARNING: Nuke Op uplink with no purchase_log Owner: [H.owner]") + text += "
    " + text += "(Syndicates used [TC_uses] TC) [purchases]" + if(TC_uses == 0 && SSticker.mode.station_was_nuked && !operatives_dead()) + text += "[icon2html('icons/badass.dmi', world, "badass")]" + to_chat(world, text) From 614e93b9755576e8caf591824e2471602298068e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:26:28 -0600 Subject: [PATCH 57/97] Update mind.dm --- code/datums/mind.dm | 102 +++++++++----------------------------------- 1 file changed, 20 insertions(+), 82 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c0ab1dc015..5ec2eddeab 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -208,12 +208,10 @@ SSticker.mode.update_brother_icons_removed(src) /datum/mind/proc/remove_nukeop() - if(src in SSticker.mode.syndicates) - SSticker.mode.syndicates -= src - SSticker.mode.update_synd_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() + var/datum/antagonist/nukeop/nuke = has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(nuke) + remove_antag_datum(nuke.type) + special_role = null /datum/mind/proc/remove_wizard() remove_antag_datum(/datum/antagonist/wizard) @@ -329,14 +327,19 @@ SSticker.mode.add_cultist(src) else if(is_revolutionary(creator)) - var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev) ++ var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE) converter.add_revolutionary(src,FALSE) else if(is_servant_of_ratvar(creator)) add_servant_of_ratvar(current) else if(is_nuclear_operative(creator)) - make_Nuke(null, null, 0, FALSE) + var/datum/antagonist/nukeop/converter = creator.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE) + var/datum/antagonist/nukeop/N = new(src) + N.send_to_spawnpoint = FALSE + N.nukeop_outfit = null + add_antag_datum(N,converter.nuke_team) + enslaved_to = creator @@ -490,7 +493,8 @@ /** NUCLEAR ***/ text = "nuclear" - if (SSticker.mode.config_tag=="nuclear") + var/datum/antagonist/nukeop/N = has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(N) text = uppertext(text) text = "[text]: " if (src in SSticker.mode.syndicates) @@ -713,7 +717,7 @@ out += sections[i]+"
    " - if(((src in SSticker.mode.traitors) || (src in SSticker.mode.syndicates)) && ishuman(current)) + if(((src in SSticker.mode.traitors) || is_nuclear_operative(current)) && ishuman(current)) text = "Uplink: give" var/datum/component/uplink/U = find_syndicate_uplink() if(U) @@ -1071,36 +1075,14 @@ message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") log_admin("[key_name(usr)] has de-nuke op'ed [current].") if("nuclear") - if(!(src in SSticker.mode.syndicates)) - SSticker.mode.syndicates += src - SSticker.mode.update_synd_icons_added(src) - if (SSticker.mode.syndicates.len==1) - SSticker.mode.prepare_syndicate_leader(src) - else - current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" - special_role = "Syndicate" - assigned_role = "Syndicate" - to_chat(current, "You are a [syndicate_name()] agent!") - SSticker.mode.forge_syndicate_objectives(src) - SSticker.mode.greet_syndicate(src) - message_admins("[key_name_admin(usr)] has nuke op'ed [current].") - log_admin("[key_name(usr)] has nuke op'ed [current].") + if(!has_antag_datum(/datum/antagonist/nukeop,TRUE)) + add_antag_datum(/datum/antagonist/nukeop) + special_role = "Syndicate" + assigned_role = "Syndicate" + message_admins("[key_name_admin(usr)] has nuke op'ed [current].") + log_admin("[key_name(usr)] has nuke op'ed [current].") if("lair") current.forceMove(pick(GLOB.nukeop_start)) - if("dressup") - var/mob/living/carbon/human/H = current - qdel(H.belt) - qdel(H.back) - qdel(H.ears) - qdel(H.gloves) - qdel(H.head) - qdel(H.shoes) - qdel(H.wear_id) - qdel(H.wear_suit) - qdel(H.w_uniform) - - if (!SSticker.mode.equip_syndicate(current)) - to_chat(usr, "Equipping a syndicate failed!") if("tellcode") var/code for (var/obj/machinery/nuclearbomb/bombue in GLOB.machines) @@ -1348,50 +1330,6 @@ T.should_specialise = TRUE add_antag_datum(T) - -/datum/mind/proc/make_Nuke(turf/spawnloc, nuke_code, leader=0, telecrystals = TRUE) - if(!(src in SSticker.mode.syndicates)) - SSticker.mode.syndicates += src - SSticker.mode.update_synd_icons_added(src) - assigned_role = "Syndicate" - special_role = "Syndicate" - SSticker.mode.forge_syndicate_objectives(src) - SSticker.mode.greet_syndicate(src) - current.faction |= "syndicate" - - if(spawnloc) - current.forceMove(spawnloc) - - if(ishuman(current)) - var/mob/living/carbon/human/H = current - qdel(H.belt) - qdel(H.back) - qdel(H.ears) - qdel(H.gloves) - qdel(H.head) - qdel(H.shoes) - qdel(H.wear_id) - qdel(H.wear_suit) - qdel(H.w_uniform) - - SSticker.mode.equip_syndicate(current, telecrystals) - - if (nuke_code) - store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - to_chat(current, "The nuclear authorization code is: [nuke_code]") - else - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list - if(nuke) - store_memory("Syndicate Nuclear Bomb Code: [nuke.r_code]", 0, 0) - to_chat(current, "The nuclear authorization code is: nuke.r_code") - else - to_chat(current, "You were not provided with a nuclear code. Trying asking your team leader or contacting syndicate command.
    ") - - if (leader) - SSticker.mode.prepare_syndicate_leader(src,nuke_code) - else - current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" - /datum/mind/proc/make_Changling() var/datum/antagonist/changeling/C = has_antag_datum(/datum/antagonist/changeling) if(!C) From 5983d7b13db2c7d34c5958f01cac0b45a597bb04 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:27:36 -0600 Subject: [PATCH 58/97] Update antag_spawner.dm --- code/game/gamemodes/antag_spawner.dm | 61 +++++++++++++++------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 3358052c7f..e62c91168b 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -4,7 +4,7 @@ w_class = WEIGHT_CLASS_TINY var/used = 0 -/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "") +/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) return /obj/item/antag_spawner/proc/equip_antag(mob/target) @@ -67,18 +67,16 @@ else to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.") -/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, school,datum/mind/user) +/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user) new /obj/effect/particle_effect/smoke(T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key var/datum/mind/app_mind = M.mind - - var/datum/antagonist/wizard/apprentice/app = new(app_mind) app.master = user - app.school = school + app.school = kind var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard) if(master_wizard) @@ -107,7 +105,7 @@ if(used) to_chat(user, "[src] is out of power!") return FALSE - if(!(user.mind in SSticker.mode.syndicates)) + if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE if(user.z != ZLEVEL_CENTCOM) @@ -127,25 +125,25 @@ return used = TRUE var/mob/dead/observer/theghost = pick(nuke_candidates) - spawn_antag(theghost.client, get_turf(src), "syndieborg", user.mind) + spawn_antag(theghost.client, get_turf(src), "syndieborg") do_sparks(4, TRUE, src) qdel(src) else to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") -/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T) +/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key - var/code = "BOMB-NOT-FOUND" - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list - if(nuke) - code = nuke.r_code - M.mind.make_Nuke(null, code, 0, FALSE) - var/newname = M.dna.species.random_name(M.gender,0,SSticker.mode.nukeops_lastname) - M.mind.name = newname - M.real_name = newname - M.name = newname + + var/datum/antagonist/nukeop/new_op = new(M.mind) + new_op.send_to_spawnpoint = FALSE + new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals + + var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(creator_op) + M.mind.add_antag_datum(new_op,creator_op.nuke_team) + M.mind.special_role = "Nuclear Operative" //////SYNDICATE BORG /obj/item/antag_spawner/nuke_ops/borg_tele @@ -162,8 +160,12 @@ name = "syndicate medical teleporter" borg_to_spawn = "Medical" -/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T) +/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/silicon/robot/R + var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(!creator_op) + return + switch(borg_to_spawn) if("Medical") R = new /mob/living/silicon/robot/modules/syndicate/medical(T) @@ -174,8 +176,8 @@ if(prob(50)) brainfirstname = pick(GLOB.first_names_female) var/brainopslastname = pick(GLOB.last_names) - if(SSticker.mode.nukeops_lastname) //the brain inside the syndiborg has the same last name as the other ops. - brainopslastname = SSticker.mode.nukeops_lastname + if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops. + brainopslastname = creator_op.nuke_team.syndicate_name var/brainopsname = "[brainfirstname] [brainopslastname]" R.mmi.name = "Man-Machine Interface: [brainopsname]" @@ -185,7 +187,11 @@ R.real_name = R.name R.key = C.key - R.mind.make_Nuke(null, nuke_code = null,leader=0, telecrystals = TRUE) + + var/datum/antagonist/nukeop/new_borg = new(R.mind) + new_borg.send_to_spawnpoint = FALSE + R.mind.add_antag_datum(new_borg,creator_op.nuke_team) + R.mind.special_role = "Syndicate Cyborg" ///////////SLAUGHTER DEMON @@ -213,7 +219,7 @@ return used = 1 var/mob/dead/observer/theghost = pick(demon_candidates) - spawn_antag(theghost.client, get_turf(src), initial(demon_type.name),user.mind) + spawn_antag(theghost.client, get_turf(src), initial(demon_type.name)) to_chat(user, shatter_msg) to_chat(user, veil_msg) playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1) @@ -222,8 +228,7 @@ to_chat(user, "You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.") -/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "", datum/mind/user) - +/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/mob/living/simple_animal/slaughter/S = new demon_type(holder) S.holder = holder @@ -232,15 +237,15 @@ S.mind.special_role = S.name SSticker.mode.traitors += S.mind var/datum/objective/assassinate/new_objective - if(user) + if(usr) new_objective = new /datum/objective/assassinate new_objective.owner = S.mind - new_objective.target = user - new_objective.explanation_text = "[objective_verb] [user.name], the one who summoned you." + new_objective.target = usr.mind + new_objective.explanation_text = "[objective_verb] [usr.real_name], the one who summoned you." S.mind.objectives += new_objective var/datum/objective/new_objective2 = new /datum/objective new_objective2.owner = S.mind - new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]." + new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]." S.mind.objectives += new_objective2 to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. \ From 992984388bb2f91686a4ec62ea57c47d40eb5e55 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:29:04 -0600 Subject: [PATCH 59/97] Update game_mode.dm --- code/game/gamemodes/game_mode.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 803e73b9e0..a62b5f6087 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -19,6 +19,7 @@ var/probability = 0 var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report? var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm + var/nuke_off_station = 0 //Used for tracking where the nuke hit var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist @@ -526,7 +527,7 @@ /datum/game_mode/proc/generate_report() //Generates a small text blurb for the gamemode in centcom report return "Gamemode report for [name] not set. Contact a coder." -//By default nuke just ends the round -/datum/game_mode/proc/OnNukeExplosion(off_station) - if(off_station < 2) - station_was_nuked = TRUE //Will end the round on next check. + /datum/game_mode/proc/OnNukeExplosion(off_station) + nuke_off_station = off_station + if(off_station < 2). + station_was_nuked = TRUE //Will end the round on next check. From 951a54088207084a8eb10da3f2a2ba4cdccc5a34 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:29:27 -0600 Subject: [PATCH 60/97] Update nuclear.dm --- code/game/gamemodes/nuclear/nuclear.dm | 295 ++++++------------------- 1 file changed, 62 insertions(+), 233 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 94c372ef23..4fcde56a72 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -1,7 +1,3 @@ -/datum/game_mode - var/list/datum/mind/syndicates = list() - var/nukeops_lastname = "" - /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" @@ -18,12 +14,11 @@ Crew: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle." var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! - var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station - var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level var/list/pre_nukeops = list() + var/datum/objective_team/nuclear/nuke_team + /datum/game_mode/nuclear/pre_setup() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) for(var/i = 0, i < n_agents, ++i) @@ -33,120 +28,23 @@ new_op.special_role = "Nuclear Operative" log_game("[new_op.key] (ckey) has been selected as a nuclear operative") return TRUE - -//////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.join_hud(synd_mind.current) - set_antag_hud(synd_mind.current, "synd") - -/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.leave_hud(synd_mind.current) - set_antag_hud(synd_mind.current, null) - //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// /datum/game_mode/nuclear/post_setup() - var/nuke_code = random_nukecode() - var/agent_number = 1 - var/datum/mind/leader = pick(pre_nukeops) - syndicates += pre_nukeops - for(var/i = 1 to pre_nukeops.len) - var/datum/mind/op = pre_nukeops[i] - - forge_syndicate_objectives(op) - greet_syndicate(op) - equip_syndicate(op.current) - - if(nuke_code) - op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - to_chat(op.current, "The nuclear authorization code is: [nuke_code]") - - if(op == leader) - op.current.forceMove(pick(GLOB.nukeop_leader_start)) - prepare_syndicate_leader(op, nuke_code) - else - op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1]) - op.current.real_name = "[syndicate_name()] Operative #[agent_number++]" - - update_synd_icons_added(op) - op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0) - - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list - if(nuke) - nuke.r_code = nuke_code + //Assign leader + var/datum/mind/leader_mind = pre_nukeops[1] + var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(/datum/antagonist/nukeop/leader) + nuke_team = L.nuke_team + //Assign the remaining operatives + for(var/i = 2 to pre_nukeops.len) + var/datum/mind/nuke_mind = pre_nukeops[i] + nuke_mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) return ..() -/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code) - var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - addtimer(CALLBACK(src, .proc/nuketeam_name_assign, synd_mind), 1) - synd_mind.current.real_name = "[syndicate_name()] [leader_title]" - to_chat(synd_mind.current, "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") - to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - - var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge - synd_mind.current.put_in_hands(challenge, TRUE) - - var/static/id_cache = typecacheof(/obj/item/card/id) - var/list/foundIDs = typecache_filter_list(synd_mind.current.GetAllContents(), id_cache) - if(foundIDs.len) - for(var/i in 1 to foundIDs.len) - var/obj/item/card/id/ID = foundIDs[i] - ID.name = "lead agent card" - ID.access += ACCESS_SYNDICATE_LEADER - else - message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!") - - var/obj/item/device/radio/headset/syndicate/alt/A = locate() in synd_mind.current - if(A) - A.command = TRUE - - if(nuke_code) - var/obj/item/paper/P = new - P.info = "The nuclear authorization code is: [nuke_code]" - P.name = "nuclear bomb code" - var/mob/living/carbon/human/H = synd_mind.current - H.put_in_hands(P, TRUE) - H.update_icons() - else - nuke_code = "code will be provided later" - return - -/datum/game_mode/proc/nuketeam_name_assign(datum/mind/synd_mind) - nukeops_lastname = nukelastname(synd_mind.current) - NukeNameAssign(nukeops_lastname, syndicates) - - -/datum/game_mode/proc/forge_syndicate_objectives(datum/mind/syndicate) - var/datum/objective/nuclear/syndobj = new - syndobj.owner = syndicate - syndicate.objectives += syndobj - - -/datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1) - if(you_are) - to_chat(syndicate.current, "You are a [syndicate_name()] agent!") - syndicate.announce_objectives() - -/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE) - synd_mob.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs - - if(telecrystals) - synd_mob.equipOutfit(/datum/outfit/syndicate) - else - synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals) - return TRUE - /datum/game_mode/nuclear/OnNukeExplosion(off_station) ..() nukes_left-- - var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate") - syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1 - nuke_off_station = off_station /datum/game_mode/nuclear/check_win() if (nukes_left == 0) @@ -154,8 +52,8 @@ return ..() /datum/game_mode/proc/are_operatives_dead() - for(var/datum/mind/operative_mind in syndicates) - if(ishuman(operative_mind.current) && (operative_mind.current.stat!=2)) + for(var/datum/mind/operative_mind in get_antagonists(/datum/antagonist/nukeop)) + if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) return FALSE return TRUE @@ -164,7 +62,7 @@ return replacementmode.check_finished() if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) return TRUE - if(are_operatives_dead()) + if(nuke_team.operatives_dead()) var/obj/machinery/nuclearbomb/N pass(N) //suppress unused warning if(N.bomb_set) //snaaaaaaaaaake! It's not over yet! @@ -172,85 +70,39 @@ ..() /datum/game_mode/nuclear/declare_completion() - var/disk_rescued = 1 - for(var/obj/item/disk/nuclear/D in GLOB.poi_list) - if(!D.onCentCom()) - disk_rescued = 0 - break - var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME) - - if(nuke_off_station == NUKE_SYNDICATE_BASE) - SSticker.mode_result = "loss - syndicate nuked - disk secured" - to_chat(world, "Humiliating Syndicate Defeat") - to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") - - SSticker.news_report = NUKE_SYNDICATE_BASE - - else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - SSticker.mode_result = "win - syndicate nuke" - to_chat(world, "Syndicate Major Victory!") - to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") - - SSticker.news_report = STATION_NUKED - - else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" - to_chat(world, "Total Annihilation") - to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") - - SSticker.news_report = STATION_NUKED - - else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - SSticker.mode_result = "halfwin - blew wrong station" - to_chat(world, "Crew Minor Victory") - to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") - - SSticker.news_report = NUKE_MISS - - else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" - to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") - to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") - - SSticker.news_report = NUKE_MISS - - else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) - SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" - to_chat(world, "Crew Major Victory!") - to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") - - SSticker.news_report = OPERATIVES_KILLED - - else if (disk_rescued) - SSticker.mode_result = "loss - evacuation - disk secured" - to_chat(world, "Crew Major Victory") - to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") - - SSticker.news_report = OPERATIVES_KILLED - - else if (!disk_rescued && are_operatives_dead()) - SSticker.mode_result = "halfwin - evacuation - disk not secured" - to_chat(world, "Neutral Victory!") - to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") - - SSticker.news_report = OPERATIVE_SKIRMISH - - else if (!disk_rescued && crew_evacuated) - SSticker.mode_result = "halfwin - detonation averted" - to_chat(world, "Syndicate Minor Victory!") - to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") - - SSticker.news_report = OPERATIVE_SKIRMISH - - else if (!disk_rescued && !crew_evacuated) - SSticker.mode_result = "halfwin - interrupted" - to_chat(world, "Neutral Victory") - to_chat(world, "Round was mysteriously interrupted!") - - SSticker.news_report = OPERATIVE_SKIRMISH - - ..() - return + var result = nuke_team.get_result() + switch(result) + if(NUKE_RESULT_FLUKE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + SSticker.news_report = NUKE_SYNDICATE_BASE + if(NUKE_RESULT_NUKE_WIN) + SSticker.mode_result = "win - syndicate nuke" + SSticker.news_report = STATION_NUKED + if(NUKE_RESULT_NOSURVIVORS) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + SSticker.news_report = STATION_NUKED + if(NUKE_RESULT_WRONG_STATION) + SSticker.mode_result = "halfwin - blew wrong station" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_WRONG_STATION_DEAD) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_CREW_WIN) + SSticker.mode_result = "loss - evacuation - disk secured" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_DISK_LOST) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + SSticker.news_report = OPERATIVE_SKIRMISH + if(NUKE_RESULT_DISK_STOLEN) + SSticker.mode_result = "halfwin - detonation averted" + SSticker.news_report = OPERATIVE_SKIRMISH + else + SSticker.mode_result = "halfwin - interrupted" + SSticker.news_report = OPERATIVE_SKIRMISH + return ..() /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ @@ -258,48 +110,16 @@ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." /datum/game_mode/proc/auto_declare_completion_nuclear() - if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) ) - var/text = "
    The syndicate operatives were:" - var/purchases = "" - var/TC_uses = 0 - for(var/datum/mind/syndicate in syndicates) - text += printplayer(syndicate) - for(var/datum/component/uplink/H in GLOB.uplinks) - if(H.purchase_log) - purchases += H.purchase_log.generate_render() - else - stack_trace("WARNING: Uplink with no purchase_log in nuclear mode! Owner: [H.owner]") - text += "
    " - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses == 0 && station_was_nuked && !are_operatives_dead()) - text += "[icon2html('icons/badass.dmi', world, "badass")]" - to_chat(world, text) + var/list/nuke_teams = list() + for(var/datum/antagonist/nukeop/N in GLOB.antagonists) //collect all nuke teams + nuke_teams |= N.nuke_team + for(var/datum/objective_team/nuclear/nuke_team in nuke_teams) + nuke_team.roundend_display() return TRUE -/proc/nukelastname(mob/M) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. - var/randomname = pick(GLOB.last_names) - var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN) - - if (!newname) - newname = randomname - - else - if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_") - to_chat(M, "That name is reserved.") - return nukelastname(M) - - return capitalize(newname) - -/proc/NukeNameAssign(lastname,list/syndicates) - for(var/datum/mind/synd_mind in syndicates) - var/mob/living/carbon/human/H = synd_mind.current - synd_mind.name = H.dna.species.random_name(H.gender,0,lastname) - synd_mind.current.real_name = synd_mind.name - return - /proc/is_nuclear_operative(mob/M) - return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates + return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop) /datum/outfit/syndicate name = "Syndicate Operative - Basic" @@ -315,15 +135,24 @@ backpack_contents = list(/obj/item/storage/box/syndie=1) var/tc = 25 + var/command_radio = FALSE + + +/datum/outfit/syndicate/leader + name = "Syndicate Leader - Basic" + id = /obj/item/card/id/syndicate/nuke_leader + r_hand = /obj/item/device/nuclear_challenge + command_radio = TRUE /datum/outfit/syndicate/no_crystals tc = 0 - /datum/outfit/syndicate/post_equip(mob/living/carbon/human/H) var/obj/item/device/radio/R = H.ears R.set_frequency(GLOB.SYND_FREQ) R.freqlock = 1 + if(command_radio) + R.command = TRUE if(tc) var/obj/item/device/radio/uplink/nuclear/U = new(H, H.key, tc) From c545ef06cdf7c4fea3619fd9a0c814fdc5d05b1e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:30:23 -0600 Subject: [PATCH 61/97] Update nuclearbomb.dm --- code/game/gamemodes/nuclear/nuclearbomb.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index e35eaed9f1..d6d14a3f84 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -77,16 +77,16 @@ icon = 'icons/obj/machines/nuke_terminal.dmi' icon_state = "nuclearbomb_base" anchored = TRUE //stops it being moved - use_tag = TRUE /obj/machinery/nuclearbomb/syndicate + use_tag = TRUE //ui_style = "syndicate" // actually the nuke op bomb is a stole nt bomb /obj/machinery/nuclearbomb/syndicate/get_cinematic_type(off_station) var/datum/game_mode/nuclear/NM = SSticker.mode switch(off_station) if(0) - if(istype(NM) && NM.syndies_didnt_escape) + if(istype(NM) && !NM.nuke_team.syndies_escaped()) return CINEMATIC_ANNIHILATION else return CINEMATIC_NUKE_WIN @@ -572,4 +572,4 @@ This is here to make the tiles around the station mininuke change when it's arme user.visible_message("[user] is pretending to go delta! It looks like [user.p_theyre()] trying to commit suicide!") playsound(src, 'sound/machines/alarm.ogg', 30, -1, 1) addtimer(CALLBACK(src, .proc/manual_suicide, user), 101) - return MANUAL_SUICIDE \ No newline at end of file + return MANUAL_SUICIDE From 9d90a2bf5bae16bbe482065812b93b4a0ea3c824 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:30:54 -0600 Subject: [PATCH 62/97] Update pinpointer.dm --- code/game/gamemodes/nuclear/pinpointer.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 2df573dc6d..7047729294 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -71,9 +71,9 @@ target = null var/list/possible_targets = list() var/turf/here = get_turf(src) - for(var/V in SSticker.mode.syndicates) + for(var/V in get_antagonists(/datum/antagonist/nukeop)) var/datum/mind/M = V - if(M.current && M.current.stat != DEAD) + if(ishuman(M.current) && M.current.stat != DEAD) possible_targets |= M.current var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here) if(closest_operative) From 2b434438e0f179d2c89f590407219f731207ca38 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:31:17 -0600 Subject: [PATCH 63/97] Update telecrystalconsoles.dm --- code/game/machinery/computer/telecrystalconsoles.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 66a266ddb3..8679652a10 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -154,7 +154,8 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. ..() - var/danger = GLOB.joined_player_list.len - SSticker.mode.syndicates.len + var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) + var/danger = GLOB.joined_player_list.len - nukeops.len // var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) // var/danger = GLOB.joined_player_list.len - nukeops.len danger = CEILING(danger, 10) From 74bba8aea72f22b13b0526c94a3c38d9b1abc2a3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:31:44 -0600 Subject: [PATCH 64/97] Update cards_ids.dm --- code/game/objects/items/cards_ids.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index ed9a6712a8..0f65281328 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -155,6 +155,11 @@ update_label("John Doe", "Clowny") name = "agent card" access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE) var/anyone = FALSE //Can anyone forge the ID or just syndicate? + +/obj/item/card/id/syndicate/nuke_leader + name = "lead agent card" + access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + /obj/item/card/id/syndicate/Initialize() . = ..() From 80412ae3b914483a380c089a9835a6b62683cb05 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:32:18 -0600 Subject: [PATCH 65/97] Update player_panel.dm --- code/modules/admin/player_panel.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index fa6e184ab4..b5d908d669 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -384,9 +384,10 @@ dat += "
    [other_players] players in invalid state or the statistics code is bugged!" dat += "
    " - if(SSticker.mode.syndicates.len) + var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) + if(nukeops.len) dat += "
    " - for(var/datum/mind/N in SSticker.mode.syndicates) + for(var/datum/mind/N in nukeops) var/mob/M = N.current if(M) dat += "" From da2bf6293f6d1361f0a4000df94795b0660d83c9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:34:02 -0600 Subject: [PATCH 66/97] Update one_click_antag.dm --- code/modules/admin/verbs/one_click_antag.dm | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 8a18dc9ac5..836a6e26be 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -238,26 +238,18 @@ if(agentcount < 3) return 0 - var/nuke_code = random_nukecode() - - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list - if(nuke) - nuke.r_code = nuke_code - //Let's find the spawn locations var/leader_chosen = FALSE - var/spawnpos = 1 //Decides where they'll spawn. 1=leader. - + + var/datum/objective_team/nuclear/nuke_team for(var/mob/c in chosen) - if(spawnpos > GLOB.nukeop_start.len) - spawnpos = 1 //Ran out of spawns. Let's loop back to the first non-leader position var/mob/living/carbon/human/new_character=makeBody(c) if(!leader_chosen) leader_chosen = TRUE - new_character.mind.make_Nuke(pick(GLOB.nukeop_leader_start), nuke_code, TRUE) + var/datum/antagonist/nukeop/N = new_character.mind.add_antag_datum(/datum/antagonist/nukeop/leader) + nuke_team = N.nuke_team else - new_character.mind.make_Nuke(GLOB.nukeop_start[spawnpos], nuke_code) - spawnpos++ + new_character.mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) return 1 else return 0 From 2148eb021b13c153c1ba54d91bf6d7cb8a435c6e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:34:44 -0600 Subject: [PATCH 67/97] Update randomverbs.dm --- code/modules/admin/verbs/randomverbs.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 48ba94bb76..eed265598e 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -386,7 +386,8 @@ Traitors and the like can also be revived with the previous role mostly intact. A.equip_wizard() if("Syndicate") new_character.forceMove(pick(GLOB.nukeop_start)) - call(/datum/game_mode/proc/equip_syndicate)(new_character) + var/datum/antagonist/nukeop/N = new_character.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE) + N.equip_op() if("Space Ninja") var/list/ninja_spawn = list() for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) From 9ab75d37b7f62faf46771307b6d20dd9b7c18338 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:35:41 -0600 Subject: [PATCH 68/97] Update operative.dm --- code/modules/events/operative.dm | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 47130ff924..894ad7e995 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -27,31 +27,13 @@ A.copy_to(operative) operative.dna.update_dna_identity() - operative.equipOutfit(/datum/outfit/syndicate/full) - var/datum/mind/Mind = new /datum/mind(selected.key) Mind.assigned_role = "Lone Operative" Mind.special_role = "Lone Operative" - SSticker.mode.traitors |= Mind Mind.active = 1 - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.machines - if(nuke) - var/nuke_code - if(!nuke.r_code || nuke.r_code == "ADMIN") - nuke_code = random_nukecode() - nuke.r_code = nuke_code - else - nuke_code = nuke.r_code - - Mind.store_memory("Station Self-Destruct Device Code: [nuke_code]", 0, 0) - to_chat(Mind.current, "The nuclear authorization code is: [nuke_code]") - - var/datum/objective/nuclear/O = new() - O.owner = Mind - Mind.objectives += O - Mind.transfer_to(operative) + Mind.add_antag_datum(/datum/antagonist/nukeop/lone) message_admins("[key_name_admin(operative)] has been made into lone operative by an event.") log_game("[key_name(operative)] was spawned as a lone operative by an event.") From efc41a15d3b2ca37a7717595f9b30959b04c3205 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:36:03 -0600 Subject: [PATCH 69/97] Update mob_helpers.dm --- code/modules/mob/mob_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3dc56c936b..747d589c05 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -363,7 +363,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(M.mind in SSticker.mode.cult) return 2 if("nuclear") - if(M.mind in SSticker.mode.syndicates) + if(M.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) return 2 if("changeling") if(M.mind.has_antag_datum(/datum/antagonist/changeling,TRUE)) From 7c3dc0705c29630bd87283d7a8ca14f40d4f01ea Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 19:36:49 -0600 Subject: [PATCH 70/97] Update tgstation.dme --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 6123e6c34a..cdd7f3aed4 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -329,6 +329,7 @@ #include "code\datums\antagonists\devil.dm" #include "code\datums\antagonists\internal_affairs.dm" #include "code\datums\antagonists\ninja.dm" +#include "code\datums\antagonists\nukeop.dm" #include "code\datums\antagonists\pirate.dm" #include "code\datums\antagonists\revolution.dm" #include "code\datums\antagonists\wizard.dm" From a8e36670e214d24aa4bcad869a30f89f97db91a8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 20:02:03 -0600 Subject: [PATCH 71/97] Update mind.dm --- code/datums/mind.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5ec2eddeab..d68566f4e4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -327,7 +327,7 @@ SSticker.mode.add_cultist(src) else if(is_revolutionary(creator)) -+ var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE) + var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE) converter.add_revolutionary(src,FALSE) else if(is_servant_of_ratvar(creator)) From 36ad355f9d31c4a54d18640e79a809e1fe36c799 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 20:08:49 -0600 Subject: [PATCH 72/97] Update mind.dm --- code/datums/mind.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d68566f4e4..f0d2337814 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1077,10 +1077,10 @@ if("nuclear") if(!has_antag_datum(/datum/antagonist/nukeop,TRUE)) add_antag_datum(/datum/antagonist/nukeop) - special_role = "Syndicate" - assigned_role = "Syndicate" - message_admins("[key_name_admin(usr)] has nuke op'ed [current].") - log_admin("[key_name(usr)] has nuke op'ed [current].") + special_role = "Syndicate" + assigned_role = "Syndicate" + message_admins("[key_name_admin(usr)] has nuke op'ed [current].") + log_admin("[key_name(usr)] has nuke op'ed [current].") if("lair") current.forceMove(pick(GLOB.nukeop_start)) if("tellcode") From 7dec65ff857a2e8ce04d7c054abe9fb7fdae7f1e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 20:20:09 -0600 Subject: [PATCH 73/97] fuck --- {datums => code/datums}/antagonists/nukeop.dm | 0 tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {datums => code/datums}/antagonists/nukeop.dm (100%) diff --git a/datums/antagonists/nukeop.dm b/code/datums/antagonists/nukeop.dm similarity index 100% rename from datums/antagonists/nukeop.dm rename to code/datums/antagonists/nukeop.dm diff --git a/tgstation.dme b/tgstation.dme index cdd7f3aed4..2852a1d295 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2452,7 +2452,7 @@ #include "modular_citadel\cydonian_armor.dm" #include "modular_citadel\polychromic_clothes.dm" #include "modular_citadel\code\datums\uplink_items_cit.dm" +#include "modular_citadel\code\game\objects\items\devices\PDA\PDA.dm" #include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" #include "modular_citadel\code\modules\crafting\recipes.dm" -#include "modular_citadel\code\game\objects\items\devices\PDA\PDA.dm" // END_INCLUDE From 4d5c32ae5648a4d8775a9298dbcefbcee52480bc Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 22:11:04 -0600 Subject: [PATCH 74/97] Update game_mode.dm --- code/game/gamemodes/game_mode.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a62b5f6087..e23464fbdd 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -527,7 +527,8 @@ /datum/game_mode/proc/generate_report() //Generates a small text blurb for the gamemode in centcom report return "Gamemode report for [name] not set. Contact a coder." - /datum/game_mode/proc/OnNukeExplosion(off_station) +//By default nuke just ends the round +/datum/game_mode/proc/OnNukeExplosion(off_station) nuke_off_station = off_station - if(off_station < 2). - station_was_nuked = TRUE //Will end the round on next check. + if(off_station < 2) +station_was_nuked = TRUE //Will end the round on next check. From 5bd61908a3f222a8128c5543fde870bf306fb25f Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 23:53:36 -0600 Subject: [PATCH 75/97] Update game_mode.dm --- code/game/gamemodes/game_mode.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index e23464fbdd..ca6755dbd3 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -531,4 +531,4 @@ /datum/game_mode/proc/OnNukeExplosion(off_station) nuke_off_station = off_station if(off_station < 2) -station_was_nuked = TRUE //Will end the round on next check. + station_was_nuked = TRUE //Will end the round on next check. From d6a5ee596b2d97877d1956dd5524d82d2ccf0a0d Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 19 Dec 2017 23:55:36 -0600 Subject: [PATCH 76/97] Update mind.dm --- code/datums/mind.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f0d2337814..b41dadc95a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -493,11 +493,11 @@ /** NUCLEAR ***/ text = "nuclear" - var/datum/antagonist/nukeop/N = has_antag_datum(/datum/antagonist/nukeop,TRUE) - if(N) + if (SSticker.mode.config_tag=="nuclear") text = uppertext(text) text = "[text]: " - if (src in SSticker.mode.syndicates) + var/datum/antagonist/nukeop/N = has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(N) text += "OPERATIVE | nanotrasen" text += "
    To shuttle, undress, dress up." var/code From 8a1ed708881310b760eaef93e4b23df0327d9adc Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 20 Dec 2017 00:08:37 -0600 Subject: [PATCH 77/97] Update roundend.dm --- code/__HELPERS/roundend.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 7bd08167e6..9ba1c767b7 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -71,10 +71,10 @@ if(LAZYLEN(GLOB.round_end_notifiees)) send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") - for(var/client/C in GLOB.clients) + /*for(var/client/C in GLOB.clients) if(!C.credits) C.RollCredits() - C.playtitlemusic(40) + C.playtitlemusic(40)*/ display_report() @@ -409,4 +409,4 @@ else objective_parts += "Objective #[count]: [objective.explanation_text] Fail." count++ - return objective_parts.Join("
    ") \ No newline at end of file + return objective_parts.Join("
    ") From e6e197c88a36455a36d266548a895c58020a035c Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Dec 2017 00:52:33 -0500 Subject: [PATCH 78/97] Adds NAMEOF, VARSET_CALLBACK, and VARSET_LIST_CALLBACK (#33543) * Adds NAMEOF and VARSET_CALLBACK * Fix VARSET_CALLBACK * Change names, add VARSET_LIST_CALLBACK * Fix var names * Additional macro safety. Update commen * ImprovedName * Fixing --- code/__HELPERS/unsorted.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 207e69fa9b..28b31f4e98 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1514,3 +1514,20 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) for(var/V in GLOB.player_list) if(is_servant_of_ratvar(V) || isobserver(V)) . += V + +//datum may be null, but it does need to be a typed var +#define NAMEOF(datum, X) (list(##datum.##X, #X)[2]) + +#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) +//dupe code because dm can't handle 3 level deep macros +#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) + +/proc/___callbackvarset(list_or_datum, var_name, var_value) + if(length(list_or_datum)) + list_or_datum[var_name] = var_value + return + var/datum/D = list_or_datum + if(IsAdminAdvancedProcCall()) + D.vv_edit_var(var_name, var_value) //same result generally, unless badmemes + else + D.vars[var_name] = var_value From d960c45e7766810106c6ab447686620dce240036 Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 20 Dec 2017 17:45:39 +1300 Subject: [PATCH 80/97] Merge pull request #33622 from duncathan/assert_gas restores add_gas(), assert_gas(), and thermal_energy() as wrapper procs --- code/__DEFINES/atmospherics.dm | 2 -- code/game/mecha/equipment/tools/other_tools.dm | 2 +- .../effects/effect_system/effects_smoke.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 2 +- code/game/objects/items/tanks/tank_types.dm | 8 ++++---- code/game/turfs/open.dm | 4 ++-- code/modules/admin/verbs/debug.dm | 2 +- .../atmospherics/gasmixtures/gas_mixture.dm | 15 ++++++++++++++- .../components/trinary_devices/filter.dm | 2 +- .../machinery/components/unary_devices/tank.dm | 2 +- .../components/unary_devices/vent_scrubber.dm | 2 +- .../modules/atmospherics/machinery/other/miner.dm | 2 +- .../atmospherics/machinery/portable/canister.dm | 2 +- .../atmospherics/machinery/portable/scrubber.dm | 2 +- code/modules/power/singularity/collector.dm | 2 +- 15 files changed, 31 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 20d80cb904..1024bb1229 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -202,6 +202,4 @@ #define ADD_GAS(gas_id, out_list)\ var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id]; out_list[gas_id] = tmp_gaslist.Copy(); -//ASSERT_GAS(gas_id, gas_mixture) - used to guarantee that the gas list for this id exists in gas_mixture.gases. -//Must be used before adding to a gas. May be used before reading from a gas. #define ASSERT_GAS(gas_id, gas_mixture) if (!gas_mixture.gases[gas_id]) { ADD_GAS(gas_id, gas_mixture.gases) }; diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 8951a0dbd5..385d112542 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -422,7 +422,7 @@ if(!istype(T)) return var/datum/gas_mixture/GM = new - ADD_GAS(/datum/gas/plasma, GM.gases) + GM.add_gas(/datum/gas/plasma) if(prob(10)) GM.gases[/datum/gas/plasma][MOLES] += 100 GM.temperature = 1500+T0C //should be enough to start a fire diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 3de8432ee9..4dc985c9a1 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -169,7 +169,7 @@ qdel(H) var/list/G_gases = G.gases if(G_gases[/datum/gas/plasma]) - ASSERT_GAS(/datum/gas/nitrogen, G) + G.assert_gas(/datum/gas/nitrogen) G_gases[/datum/gas/nitrogen][MOLES] += (G_gases[/datum/gas/plasma][MOLES]) G_gases[/datum/gas/plasma][MOLES] = 0 G.garbage_collect() diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index f1644f0b1a..6466696b98 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -17,7 +17,7 @@ /obj/item/tank/jetpack/New() ..() if(gas_type) - ASSERT_GAS(gas_type,air_contents) + air_contents.assert_gas(gas_type) air_contents.gases[gas_type][MOLES] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C) ion_trail = new diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 7a1fa569a3..4a687b458d 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -21,7 +21,7 @@ /obj/item/tank/internals/oxygen/New() ..() - ASSERT_GAS(/datum/gas/oxygen, air_contents) + air_contents.assert_gas(/datum/gas/oxygen) air_contents.gases[/datum/gas/oxygen][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return @@ -87,7 +87,7 @@ /obj/item/tank/internals/plasma/New() ..() - ASSERT_GAS(/datum/gas/plasma, air_contents) + air_contents.assert_gas(/datum/gas/plasma) air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return @@ -124,7 +124,7 @@ /obj/item/tank/internals/plasmaman/New() ..() - ASSERT_GAS(/datum/gas/plasma, air_contents) + air_contents.assert_gas(/datum/gas/plasma) air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return @@ -166,7 +166,7 @@ /obj/item/tank/internals/emergency_oxygen/New() ..() - ASSERT_GAS(/datum/gas/oxygen, air_contents) + air_contents.assert_gas(/datum/gas/oxygen) air_contents.gases[/datum/gas/oxygen][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 5d83d677de..0eddbc411e 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -355,6 +355,6 @@ if (air.gases[/datum/gas/carbon_dioxide] && air.gases[/datum/gas/oxygen]) air.gases[/datum/gas/carbon_dioxide][MOLES]=max(air.gases[/datum/gas/carbon_dioxide][MOLES]-(pulse_strength/1000),0) air.gases[/datum/gas/oxygen][MOLES]=max(air.gases[/datum/gas/oxygen][MOLES]-(pulse_strength/2000),0) - ASSERT_GAS(/datum/gas/pluoxium,air) + air.assert_gas(/datum/gas/pluoxium) air.gases[/datum/gas/pluoxium][MOLES]+=(pulse_strength/4000) - air.garbage_collect() \ No newline at end of file + air.garbage_collect() diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b02fe03c18..e2bb78c9ec 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -735,7 +735,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) if(Rad.anchored) if(!Rad.loaded_tank) var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad) - ASSERT_GAS(/datum/gas/plasma, Plasma.air_contents) + Plasma.air_contents.assert_gas(/datum/gas/plasma) Plasma.air_contents.gases[/datum/gas/plasma][MOLES] = 70 Rad.drainratio = 0 Rad.loaded_tank = Plasma diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 64d77a27dc..376ca08b28 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -37,14 +37,24 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) reaction_results = new //listmos procs +//use the macros in performance intensive areas. for their definitions, refer to code/__DEFINES/atmospherics.dm -// The following procs used to live here: thermal_energy(), assert_gas() and add_gas(). They have been moved into defines in code/__DEFINES/atmospherics.dm + //assert_gas(gas_id) - used to guarantee that the gas list for this id exists in gas_mixture.gases. + //Must be used before adding to a gas. May be used before reading from a gas. +/datum/gas_mixture/proc/assert_gas(gas_id) + ASSERT_GAS(gas_id, src) //assert_gases(args) - shorthand for calling ASSERT_GAS() once for each gas type. /datum/gas_mixture/proc/assert_gases() for(var/id in args) ASSERT_GAS(id, src) + //add_gas(gas_id) - similar to assert_gas(), but does not check for an existing + //gas list for this id. This can clobber existing gases. + //Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas(). +/datum/gas_mixture/proc/add_gas(gas_id) + ADD_GAS(gas_id, gases) + //add_gases(args) - shorthand for calling add_gas() once for each gas_type. /datum/gas_mixture/proc/add_gases() var/cached_gases = gases @@ -101,6 +111,9 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /datum/gas_mixture/proc/return_volume() //liters return max(0, volume) +/datum/gas_mixture/proc/thermal_energy() //joules + return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas + /datum/gas_mixture/proc/archive() //Update archived versions of variables //Returns: 1 in all cases diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 9a8034064c..a1d6dc8c7e 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -103,7 +103,7 @@ var/datum/gas_mixture/filtered_out = new filtered_out.temperature = removed.temperature - ASSERT_GAS(filter_type, filtered_out) + filtered_out.add_gas(filter_type) filtered_out.gases[filter_type][MOLES] = removed.gases[filter_type][MOLES] removed.gases[filter_type][MOLES] = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index ec1fcdfc52..4e9df101a6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -17,7 +17,7 @@ air_contents.volume = volume air_contents.temperature = T20C if(gas_type) - ASSERT_GAS(gas_type, air_contents) + air_contents.assert_gas(gas_type) air_contents.gases[gas_type][MOLES] = AIR_CONTENTS name = "[name] ([air_contents.gases[gas_type][GAS_META][META_GAS_NAME]])" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index b3ade6f0fb..8fffd70840 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -179,7 +179,7 @@ filtered_out.temperature = removed.temperature for(var/gas in filter_types & removed_gases) - ADD_GAS(gas, filtered_gases) + filtered_out.add_gas(gas) filtered_gases[gas][MOLES] = removed_gases[gas][MOLES] removed_gases[gas][MOLES] = 0 diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index cb28f17802..f63065b431 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -132,7 +132,7 @@ if(!isopenturf(O)) return FALSE var/datum/gas_mixture/merger = new - ASSERT_GAS(spawn_id, merger) + merger.assert_gas(spawn_id) merger.gases[spawn_id][MOLES] = (spawn_mol) merger.temperature = spawn_temp O.assume_air(merger) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index ddc562bbb7..7b6351e939 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -196,7 +196,7 @@ /obj/machinery/portable_atmospherics/canister/proc/create_gas() if(gas_type) - ADD_GAS(gas_type, air_contents.gases) + air_contents.add_gas(gas_type) if(starter_temp) air_contents.temperature = starter_temp air_contents.gases[gas_type][MOLES] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 3ba7e0a110..4bb7b02288 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -45,7 +45,7 @@ filtered.temperature = filtering.temperature for(var/gas in filtering.gases & scrubbing) - ADD_GAS(gas, filtered.gases) + filtered.add_gas(gas) filtered.gases[gas][MOLES] = filtering.gases[gas][MOLES] // Shuffle the "bad" gasses to the filtered mixture. filtering.gases[gas][MOLES] = 0 filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 36dd615e86..a5e9db1fde 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -37,7 +37,7 @@ eject() else loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= 0.001*drainratio - ASSERT_GAS(/datum/gas/tritium,loaded_tank.air_contents) + loaded_tank.air_contents.assert_gas(/datum/gas/tritium) loaded_tank.air_contents.gases[/datum/gas/tritium][MOLES] += 0.001*drainratio loaded_tank.air_contents.garbage_collect() From b305f1bb26cc3ee6fd5f05ec5649cbe696c6ad8a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Dec 2017 19:28:35 -0500 Subject: [PATCH 82/97] Merge pull request #33664 from optimumtact/darkgenerallordhassnowflakeears Halve gun empty sound level --- code/game/objects/items/toys.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/projectiles/guns/ballistic/revolver.dm | 2 +- code/modules/projectiles/guns/energy.dm | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 259193b177..689f50769c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -182,7 +182,7 @@ src.add_fingerprint(user) if (src.bullets < 1) user.show_message("*click*", 2) - playsound(src, "gun_dry_fire", 60, 1) + playsound(src, "gun_dry_fire", 30, 1) return playsound(user, 'sound/weapons/gunshot.ogg', 100, 1) src.bullets-- diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 047243cb45..ff7ed7653e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -107,7 +107,7 @@ /obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "*click*") - playsound(src, "gun_dry_fire", 60, 1) + playsound(src, "gun_dry_fire", 30, 1) /obj/item/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index f5d846c912..c4ba7a33b7 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -175,7 +175,7 @@ return(OXYLOSS) else user.visible_message("[user] is pretending to blow [user.p_their()] brain[user.p_s()] out with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(src, "gun_dry_fire", 60, 1) + playsound(src, "gun_dry_fire", 30, 1) return (OXYLOSS) #undef BRAINS_BLOWN_THROW_SPEED #undef BRAINS_BLOWN_THROW_RANGE diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index a802ca8bbe..f642a94284 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -229,7 +229,7 @@ return user.visible_message("*click*") - playsound(src, "gun_dry_fire", 60, 1) + playsound(src, "gun_dry_fire", 30, 1) /obj/item/gun/ballistic/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = "head") user.apply_damage(300, BRUTE, affecting) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index e80f0758c1..b52a56426b 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -175,7 +175,7 @@ return(OXYLOSS) else user.visible_message("[user] is pretending to blow [user.p_their()] brains out with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(src, "gun_dry_fire", 60, 1) + playsound(src, "gun_dry_fire", 30, 1) return (OXYLOSS) From 25d5e5b6b46963e695c9bb7f0b8ab470d15627ac Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Dec 2017 17:23:26 -0500 Subject: [PATCH 84/97] Merge pull request #33594 from AnturK/knockoff Adds knock off component --- code/__DEFINES/components.dm | 1 + code/datums/components/knockoff.dm | 53 +++++++++++++++++++ code/game/objects/items.dm | 2 + code/game/objects/items/cigs_lighters.dm | 1 + .../mob/living/carbon/human/species.dm | 8 +-- tgstation.dme | 1 + 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 code/datums/components/knockoff.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 0b2a3e06d4..4bb27d56d6 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -82,6 +82,7 @@ // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) +#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) #define CALTROP_BYPASS_SHOES 1 #define CALTROP_IGNORE_WALKERS 2 diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm new file mode 100644 index 0000000000..35d1e5423e --- /dev/null +++ b/code/datums/components/knockoff.dm @@ -0,0 +1,53 @@ +//Items with these will have a chance to get knocked off when disarming +/datum/component/knockoff + var/knockoff_chance = 100 //Chance to knockoff + var/list/target_zones //Aiming for these zones will cause the knockoff, null means all zones allowed + var/list/slots_knockoffable //Can be only knocked off from these slots, null means all slots allowed + var/datum/component/redirect/disarm_redirect + +/datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable) + if(!isitem(parent)) + . = COMPONENT_INCOMPATIBLE + CRASH("Knockoff component misuse") + RegisterSignal(COMSIG_ITEM_EQUIPPED,.proc/OnEquipped) + RegisterSignal(COMSIG_ITEM_DROPPED,.proc/OnDropped) + + src.knockoff_chance = knockoff_chance + + if(zone_override) + target_zones = zone_override + + if(slots_knockoffable) + src.slots_knockoffable = slots_knockoffable + +/datum/component/knockoff/proc/Knockoff(mob/living/attacker,zone) + var/obj/item/I = parent + var/mob/living/carbon/human/wearer = I.loc + if(!istype(wearer)) + return + if(target_zones && !(zone in target_zones)) + return + if(!prob(knockoff_chance)) + return + if(!wearer.dropItemToGround(I)) + return + + wearer.visible_message("[attacker] knocks off [wearer]'s [I.name]!","[attacker] knocks off your [I.name]!") + +/datum/component/knockoff/proc/OnEquipped(mob/living/carbon/human/H,slot) + if(!istype(H)) + return + if(slots_knockoffable && !(slot in slots_knockoffable)) + if(disarm_redirect) + QDEL_NULL(disarm_redirect) + return + if(!disarm_redirect) + disarm_redirect = H.AddComponent(/datum/component/redirect,list(COMSIG_HUMAN_DISARM_HIT),CALLBACK(src,.proc/Knockoff)) + +/datum/component/knockoff/proc/OnDropped(mob/living/M) + if(disarm_redirect) + QDEL_NULL(disarm_redirect) + +/datum/component/knockoff/Destroy() + QDEL_NULL(disarm_redirect) + . = ..() \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d4e5240642..823a91cead 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -406,6 +406,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(DROPDEL_1 & flags_1) qdel(src) in_inventory = FALSE + SendSignal(COMSIG_ITEM_DROPPED,user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -436,6 +437,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/datum/action/A = X if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. A.Grant(user) + SendSignal(COMSIG_ITEM_EQUIPPED,user,slot) in_inventory = TRUE //sometimes we only want to grant the item's action if it's equipped in a specific slot. diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 9c7c34510c..fd414b8d9a 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -129,6 +129,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.add_reagent_list(list_reagents) if(starts_lit) light() + AddComponent(/datum/component/knockoff,90,list("mouth"),list(slot_wear_mask))//90% to knock off when wearing a mask /obj/item/clothing/mask/cigarette/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0b02a2c711..a3ebf5ab2f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1366,8 +1366,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) else if(target.lying) target.forcesay(GLOB.hit_appends) - - /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) var/aim_for_mouth = user.zone_selected == "mouth" var/target_on_help_and_unarmed = target.a_intent == INTENT_HELP && !target.get_active_held_item() @@ -1387,10 +1385,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) return 1 else user.do_attack_animation(target, ATTACK_EFFECT_DISARM) - + if(target.w_uniform) target.w_uniform.add_fingerprint(user) - var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) + var/randomized_zone = ran_zone(user.zone_selected) + target.SendSignal(COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) + var/obj/item/bodypart/affecting = target.get_bodypart(randomized_zone) var/randn = rand(1, 100) if(randn <= 25) playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/tgstation.dme b/tgstation.dme index 6123e6c34a..74cf9934cc 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -343,6 +343,7 @@ #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" #include "code\datums\components\decal.dm" +#include "code\datums\components\knockoff.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" #include "code\datums\components\material_container.dm" From 5f69eac0503b6d225b25d395db5b67c048a229bd Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 20 Dec 2017 00:19:39 -0600 Subject: [PATCH 86/97] Update mind.dm --- code/datums/mind.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 14d619c917..88d84eeb6c 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -202,12 +202,10 @@ SSticker.mode.update_brother_icons_removed(src) /datum/mind/proc/remove_nukeop() - if(src in SSticker.mode.syndicates) - SSticker.mode.syndicates -= src - SSticker.mode.update_synd_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() + var/datum/antagonist/nukeop/nuke = has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(nuke) + remove_antag_datum(nuke.type) +special_role = null /datum/mind/proc/remove_wizard() remove_antag_datum(/datum/antagonist/wizard) From 00d3b8f1b7d831020d8ea187ce4d10185247fef9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 20 Dec 2017 02:53:51 -0600 Subject: [PATCH 87/97] a lot of shit synced in this one commit. --- code/__HELPERS/roundend.dm | 20 ++++----- code/datums/antagonists/abductor.dm | 16 ++++---- code/datums/antagonists/antag_datum.dm | 6 +-- code/datums/antagonists/brother.dm | 18 ++++---- code/datums/antagonists/clockcult.dm | 18 ++++---- code/datums/antagonists/cult.dm | 30 +++++++------- code/datums/antagonists/pirate.dm | 25 ++++++----- code/datums/antagonists/revolution.dm | 36 ++++++++-------- code/datums/antagonists/wizard.dm | 14 +++---- code/datums/mind.dm | 12 +++--- code/game/gamemodes/antag_spawner.dm | 6 +-- code/game/gamemodes/brother/traitor_bro.dm | 8 ++-- code/game/gamemodes/clock_cult/clock_cult.dm | 9 ++-- code/game/gamemodes/cult/cult.dm | 10 ++--- code/game/gamemodes/cult/cult_comms.dm | 8 ++-- code/game/gamemodes/cult/runes.dm | 41 +++++++------------ code/game/gamemodes/game_mode.dm | 2 +- .../miniantags/abduction/abduction.dm | 16 ++++---- code/game/gamemodes/nuclear/nuclear.dm | 21 ++++------ code/game/gamemodes/revolution/revolution.dm | 2 +- code/game/gamemodes/wizard/soulstone.dm | 1 - code/modules/admin/player_panel.dm | 2 +- code/modules/admin/verbs/one_click_antag.dm | 15 ++++--- code/modules/power/singularity/narsie.dm | 2 +- tgstation.dme | 3 +- 25 files changed, 161 insertions(+), 180 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 9ba1c767b7..3b346f7e1c 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -47,7 +47,7 @@ antag_info["antagonist_name"] = A.name //For auto and custom roles antag_info["objectives"] = list() antag_info["team"] = list() - var/datum/objective_team/T = A.get_team() + var/datum/team/T = A.get_team() if(T) antag_info["team"]["type"] = T.type antag_info["team"]["name"] = T.name @@ -84,9 +84,9 @@ //Set news report and mode result mode.set_round_result() - + send2irc("Server", "Round just ended.") - + if(CONFIG_GET(string/cross_server_address)) send_news_report() @@ -142,15 +142,15 @@ parts += mode.special_report() CHECK_TICK - + //AI laws parts += law_report() - + CHECK_TICK //Antagonists parts += antag_report() - + CHECK_TICK //Medals parts += medal_report() @@ -202,7 +202,7 @@ /datum/controller/subsystem/ticker/proc/show_roundend_report(client/C,common_report) var/list/report_parts = list() - + report_parts += personal_report(C) report_parts += common_report @@ -212,7 +212,7 @@ roundend_report.set_content(report_parts.Join()) roundend_report.stylesheets = list() roundend_report.add_stylesheet("roundend",'html/browser/roundend.css') - + roundend_report.open(0) /datum/controller/subsystem/ticker/proc/personal_report(client/C) @@ -311,7 +311,7 @@ all_teams |= A.get_team() all_antagonists += A - for(var/datum/objective_team/T in all_teams) + for(var/datum/team/T in all_teams) result += T.roundend_report() for(var/datum/antagonist/X in all_antagonists) if(X.get_team() == T) @@ -336,7 +336,7 @@ previous_category = A result += A.roundend_report() result += "
    " - + if(all_antagonists.len) var/datum/antagonist/last = all_antagonists[all_antagonists.len] result += last.roundend_report_footer() diff --git a/code/datums/antagonists/abductor.dm b/code/datums/antagonists/abductor.dm index 3b8935d9fa..a98acf054e 100644 --- a/code/datums/antagonists/abductor.dm +++ b/code/datums/antagonists/abductor.dm @@ -2,7 +2,7 @@ name = "Abductor" roundend_category = "abductors" job_rank = ROLE_ABDUCTOR - var/datum/objective_team/abductor_team/team + var/datum/team/abductor_team/team var/sub_role var/outfit var/landmark_type @@ -20,7 +20,7 @@ landmark_type = /obj/effect/landmark/abductor/scientist greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." -/datum/antagonist/abductor/create_team(datum/objective_team/abductor_team/new_team) +/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) if(!new_team) return if(!istype(new_team)) @@ -73,20 +73,20 @@ A.scientist = TRUE -/datum/objective_team/abductor_team - member_name = "abductor" +/datum/team/abductor_team + member_name = "abductor" var/team_number var/list/datum/mind/abductees = list() -/datum/objective_team/abductor_team/is_solo() +/datum/team/abductor_team/is_solo() return FALSE -/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) +/datum/team/abductor_team/proc/add_objective(datum/objective/O) O.team = src O.update_explanation_text() objectives += O -/datum/objective_team/abductor_team/roundend_report() +/datum/team/abductor_team/roundend_report() var/list/result = list() var/won = TRUE @@ -127,7 +127,7 @@ var/datum/objective/abductee/O = new objtype() objectives += O owner.objectives += objectives - + /datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) SSticker.mode.update_abductor_icons_added(mob_override ? mob_override.mind : owner) diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm index 6b5a573eff..9b5dbb6d75 100644 --- a/code/datums/antagonists/antag_datum.dm +++ b/code/datums/antagonists/antag_datum.dm @@ -49,7 +49,7 @@ GLOBAL_LIST_EMPTY(antagonists) return //Assign default team and creates one for one of a kind team antagonists -/datum/antagonist/proc/create_team(datum/objective_team/team) +/datum/antagonist/proc/create_team(datum/team/team) return //Proc called when the datum is given to a mind. @@ -84,7 +84,7 @@ GLOBAL_LIST_EMPTY(antagonists) LAZYREMOVE(owner.antag_datums, src) if(!silent && owner.current) farewell() - var/datum/objective_team/team = get_team() + var/datum/team/team = get_team() if(team) team.remove_member(owner) qdel(src) @@ -155,6 +155,6 @@ GLOBAL_LIST_EMPTY(antagonists) else already_registered_objectives |= A.objectives objectives = owner.objectives - already_registered_objectives - + //This one is created by admin tools for custom objectives /datum/antagonist/custom \ No newline at end of file diff --git a/code/datums/antagonists/brother.dm b/code/datums/antagonists/brother.dm index dd3bdef9d2..b06c75e4fa 100644 --- a/code/datums/antagonists/brother.dm +++ b/code/datums/antagonists/brother.dm @@ -2,12 +2,12 @@ name = "Brother" job_rank = ROLE_BROTHER var/special_role = "blood brother" - var/datum/objective_team/brother_team/team + var/datum/team/brother_team/team /datum/antagonist/brother/New(datum/mind/new_owner) return ..() -/datum/antagonist/brother/create_team(datum/objective_team/brother_team/new_team) +/datum/antagonist/brother/create_team(datum/team/brother_team/new_team) if(!new_team) return if(!istype(new_team)) @@ -57,15 +57,15 @@ SSticker.mode.update_brother_icons_added(owner) -/datum/objective_team/brother_team +/datum/team/brother_team name = "brotherhood" member_name = "blood brother" var/meeting_area -/datum/objective_team/brother_team/is_solo() +/datum/team/brother_team/is_solo() return FALSE -/datum/objective_team/brother_team/proc/update_name() +/datum/team/brother_team/proc/update_name() var/list/last_names = list() for(var/datum/mind/M in members) var/list/split_name = splittext(M.name," ") @@ -73,7 +73,7 @@ name = last_names.Join(" & ") -/datum/objective_team/brother_team/roundend_report() +/datum/team/brother_team/roundend_report() var/list/parts = list() parts += "The blood brothers of [name] were:" @@ -95,14 +95,14 @@ return "
    [parts.Join("
    ")]
    " -/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) +/datum/team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) O.team = src if(needs_target) O.find_target() O.update_explanation_text() objectives += O -/datum/objective_team/brother_team/proc/forge_brother_objectives() +/datum/team/brother_team/proc/forge_brother_objectives() objectives = list() var/is_hijacker = prob(10) for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) @@ -113,7 +113,7 @@ else if(!locate(/datum/objective/escape) in objectives) add_objective(new/datum/objective/escape) -/datum/objective_team/brother_team/proc/forge_single_objective() +/datum/team/brother_team/proc/forge_single_objective() if(prob(50)) if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) add_objective(new/datum/objective/destroy, TRUE) diff --git a/code/datums/antagonists/clockcult.dm b/code/datums/antagonists/clockcult.dm index 5f99ccc5dd..48f9b53425 100644 --- a/code/datums/antagonists/clockcult.dm +++ b/code/datums/antagonists/clockcult.dm @@ -4,7 +4,7 @@ roundend_category = "clock cultists" job_rank = ROLE_SERVANT_OF_RATVAR var/datum/action/innate/hierophant/hierophant_network = new() - var/datum/objective_team/clockcult/clock_team + var/datum/team/clockcult/clock_team var/make_team = TRUE //This should be only false for tutorial scarabs /datum/antagonist/clockcult/silent @@ -17,14 +17,14 @@ /datum/antagonist/clockcult/get_team() return clock_team -/datum/antagonist/clockcult/create_team(datum/objective_team/clockcult/new_team) +/datum/antagonist/clockcult/create_team(datum/team/clockcult/new_team) if(!new_team && make_team) //TODO blah blah same as the others, allow multiple for(var/datum/antagonist/clockcult/H in GLOB.antagonists) if(H.clock_team) clock_team = H.clock_team return - clock_team = new /datum/objective_team/clockcult + clock_team = new /datum/team/clockcult return if(make_team && !istype(new_team)) stack_trace("Wrong team type passed to [type] initialization.") @@ -175,7 +175,7 @@ SSticker.mode.servants_of_ratvar -= owner SSticker.mode.update_servant_icons_removed(owner) if(!silent) - owner.current.visible_message("[owner] seems to have remembered their true allegiance!", ignored_mob = owner.current) + owner.current.visible_message("[owner] seems to have remembered their true allegiance!", ignored_mob = owner.current) to_chat(owner, "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) owner.wipe_memory() @@ -185,19 +185,19 @@ . = ..() -/datum/objective_team/clockcult +/datum/team/clockcult name = "Clockcult" var/list/objective var/datum/mind/eminence -/datum/objective_team/clockcult/proc/check_clockwork_victory() +/datum/team/clockcult/proc/check_clockwork_victory() if(GLOB.clockwork_gateway_activated) return TRUE return FALSE -/datum/objective_team/clockcult/roundend_report() +/datum/team/clockcult/roundend_report() var/list/parts = list() - + if(check_clockwork_victory()) parts += "Ratvar's servants defended the Ark until its activation!" else @@ -213,5 +213,5 @@ if(members.len) parts += "Ratvar's servants were:" parts += printplayerlist(members - eminence) - + return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/antagonists/cult.dm b/code/datums/antagonists/cult.dm index bce9123fb3..916123ddff 100644 --- a/code/datums/antagonists/cult.dm +++ b/code/datums/antagonists/cult.dm @@ -9,19 +9,19 @@ var/ignore_implant = FALSE var/give_equipment = FALSE - var/datum/objective_team/cult/cult_team + var/datum/team/cult/cult_team /datum/antagonist/cult/get_team() return cult_team -/datum/antagonist/cult/create_team(datum/objective_team/cult/new_team) +/datum/antagonist/cult/create_team(datum/team/cult/new_team) if(!new_team) //todo remove this and allow admin buttons to create more than one cult for(var/datum/antagonist/cult/H in GLOB.antagonists) if(H.cult_team) cult_team = H.cult_team return - cult_team = new /datum/objective_team/cult + cult_team = new /datum/team/cult cult_team.setup_objectives() return if(!istype(new_team)) @@ -59,7 +59,7 @@ SSticker.mode.cult += owner // Only add after they've been given objectives SSticker.mode.update_cult_icons_added(owner) current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - + if(cult_team.blood_target && cult_team.blood_target_image && current.client) current.client.images += cult_team.blood_target_image @@ -183,28 +183,28 @@ current.update_action_buttons_icon() current.remove_status_effect(/datum/status_effect/cult_master) -/datum/objective_team/cult +/datum/team/cult name = "Cult" var/blood_target var/image/blood_target_image var/blood_target_reset_timer - + var/cult_vote_called = FALSE var/cult_mastered = FALSE var/reckoning_complete = FALSE -/datum/objective_team/cult/proc/setup_objectives() +/datum/team/cult/proc/setup_objectives() //SAC OBJECTIVE , todo: move this to objective internals var/list/target_candidates = list() var/datum/objective/sacrifice/sac_objective = new sac_objective.team = src - + for(var/mob/living/carbon/human/player in GLOB.player_list) if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && player.stat != DEAD) target_candidates += player.mind - + if(target_candidates.len == 0) message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") for(var/mob/living/carbon/human/player in GLOB.player_list) @@ -214,7 +214,7 @@ if(LAZYLEN(target_candidates)) sac_objective.target = pick(target_candidates) sac_objective.update_explanation_text() - + var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role) var/datum/preferences/sacface = sac_objective.target.current.client.prefs var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) @@ -235,7 +235,7 @@ summon_objective.team = src objectives += summon_objective -/datum/objective/sacrifice +/datum/objective/sacrifice var/sacced = FALSE var/sac_image @@ -268,13 +268,13 @@ /datum/objective/eldergod/check_completion() return summoned || completed -/datum/objective_team/cult/proc/check_cult_victory() +/datum/team/cult/proc/check_cult_victory() for(var/datum/objective/O in objectives) if(!O.check_completion()) return FALSE return TRUE -/datum/objective_team/cult/roundend_report() +/datum/team/cult/roundend_report() var/list/parts = list() if(check_cult_victory()) @@ -291,9 +291,9 @@ else parts += "Objective #[count]: [objective.explanation_text] Fail." count++ - + if(members.len) parts += "The cultists were:" parts += printplayerlist(members) - + return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm index e0ce38c1e4..9bf20a4bf5 100644 --- a/code/datums/antagonists/pirate.dm +++ b/code/datums/antagonists/pirate.dm @@ -2,7 +2,7 @@ name = "Space Pirate" job_rank = ROLE_TRAITOR roundend_category = "space pirates" - var/datum/objective_team/pirate/crew + var/datum/team/pirate/crew /datum/antagonist/pirate/greet() to_chat(owner, "You are a Space Pirate!") @@ -12,15 +12,16 @@ /datum/antagonist/pirate/get_team() return crew -/datum/antagonist/pirate/create_team(datum/objective_team/pirate/new_team) +/datum/antagonist/pirate/create_team(datum/team/pirate/new_team) if(!new_team) for(var/datum/antagonist/pirate/P in GLOB.antagonists) if(P.crew) - new_team = P.crew + crew = P.crew + return if(!new_team) - crew = new /datum/objective_team/pirate + crew = new /datum/team/pirate crew.forge_objectives() - return + return if(!istype(new_team)) stack_trace("Wrong team type passed to [type] initialization.") crew = new_team @@ -35,10 +36,10 @@ owner.objectives -= crew.objectives . = ..() -/datum/objective_team/pirate +/datum/team/pirate name = "Pirate crew" -/datum/objective_team/pirate/proc/forge_objectives() +/datum/team/pirate/proc/forge_objectives() var/datum/objective/loot/getbooty = new() getbooty.team = src getbooty.storage_area = locate(/area/shuttle/pirate/vault) in GLOB.sortedAreas @@ -104,13 +105,11 @@ GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( /datum/objective/loot/check_completion() return ..() || get_loot_value() >= target_value - - -/datum/objective_team/pirate/roundend_report() +/datum/team/pirate/roundend_report() var/list/parts = list() parts += "Space Pirates were:" - + var/all_dead = TRUE for(var/datum/mind/M in members) if(considered_alive(M)) @@ -126,5 +125,5 @@ GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( parts += "The pirate crew was successful!" else parts += "The pirate crew has failed." - - return parts.Join("
    ") \ No newline at end of file + + return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/antagonists/revolution.dm b/code/datums/antagonists/revolution.dm index 14c6d1ab0e..3209b9221c 100644 --- a/code/datums/antagonists/revolution.dm +++ b/code/datums/antagonists/revolution.dm @@ -6,7 +6,7 @@ roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen job_rank = ROLE_REV var/hud_type = "rev" - var/datum/objective_team/revolution/rev_team + var/datum/team/revolution/rev_team /datum/antagonist/rev/can_be_owned(datum/mind/new_owner) . = ..() @@ -40,17 +40,17 @@ . = ..() /datum/antagonist/rev/greet() - to_chat(owner, " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") + to_chat(owner, "You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") owner.announce_objectives() -/datum/antagonist/rev/create_team(datum/objective_team/revolution/new_team) +/datum/antagonist/rev/create_team(datum/team/revolution/new_team) if(!new_team) //For now only one revolution at a time for(var/datum/antagonist/rev/head/H in GLOB.antagonists) if(H.rev_team) rev_team = H.rev_team return - rev_team = new /datum/objective_team/revolution + rev_team = new /datum/team/revolution rev_team.update_objectives() rev_team.update_heads() return @@ -78,7 +78,7 @@ old_owner.add_antag_datum(new_revhead,old_team) new_revhead.silent = FALSE to_chat(old_owner, "You have proved your devotion to revolution! You are a head revolutionary now!") - + /datum/antagonist/rev/head name = "Head Revolutionary" @@ -132,14 +132,14 @@ old_owner.add_antag_datum(new_rev,old_team) new_rev.silent = FALSE to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") - + /datum/antagonist/rev/farewell() if(ishuman(owner.current)) - owner.current.visible_message("[owner.current] looks like they just remembered their real allegiance!") - to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") + owner.current.visible_message("[owner.current] looks like they just remembered their real allegiance!", ignored_mob = owner.current) + to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") else if(issilicon(owner.current)) - owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.") - to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.") + owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", ignored_mob = owner.current) + to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.") /datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) log_attack("[owner.current] (Key: [key_name(owner.current)]) has been deconverted from the revolution by [deconverter] (Key: [key_name(deconverter)])!") @@ -164,7 +164,7 @@ if(remove_clumsy && owner.assigned_role == "Clown") to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") H.dna.remove_mutation(CLOWNMUT) - + if(give_flash) var/obj/item/device/assembly/flash/T = new(H) var/list/slots = list ( @@ -177,17 +177,17 @@ to_chat(H, "The Syndicate were unfortunately unable to get you a flash.") else to_chat(H, "The flash in your [where] will help you to persuade the crew to join your cause.") - + if(give_hud) var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(H) S.Insert(H, special = FALSE, drop_if_replaced = FALSE) to_chat(H, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") -/datum/objective_team/revolution +/datum/team/revolution name = "Revolution" var/max_headrevs = 3 -/datum/objective_team/revolution/proc/update_objectives(initial = FALSE) +/datum/team/revolution/proc/update_objectives(initial = FALSE) var/untracked_heads = SSjob.get_all_heads() for(var/datum/objective/mutiny/O in objectives) untracked_heads -= O.target @@ -199,16 +199,16 @@ objectives += new_target for(var/datum/mind/M in members) M.objectives |= objectives - + addtimer(CALLBACK(src,.proc/update_objectives),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) -/datum/objective_team/revolution/proc/head_revolutionaries() +/datum/team/revolution/proc/head_revolutionaries() . = list() for(var/datum/mind/M in members) if(M.has_antag_datum(/datum/antagonist/rev/head)) . += M -/datum/objective_team/revolution/proc/update_heads() +/datum/team/revolution/proc/update_heads() if(SSticker.HasRoundStarted()) var/list/datum/mind/head_revolutionaries = head_revolutionaries() var/list/datum/mind/heads = SSjob.get_all_heads() @@ -229,7 +229,7 @@ addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) -/datum/objective_team/revolution/roundend_report() +/datum/team/revolution/roundend_report() if(!members.len) return diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm index 7f23215d6c..e856a6642f 100644 --- a/code/datums/antagonists/wizard.dm +++ b/code/datums/antagonists/wizard.dm @@ -11,7 +11,7 @@ var/strip = TRUE //strip before equipping var/allow_rename = TRUE var/hud_version = "wizard" - var/datum/objective_team/wizard/wiz_team //Only created if wizard summons apprentices + var/datum/team/wizard/wiz_team //Only created if wizard summons apprentices var/move_to_lair = TRUE var/outfit_type = /datum/outfit/wizard var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ @@ -33,7 +33,7 @@ /datum/antagonist/wizard/proc/unregister() SSticker.mode.wizards -= src -/datum/antagonist/wizard/create_team(datum/objective_team/wizard/new_team) +/datum/antagonist/wizard/create_team(datum/team/wizard/new_team) if(!new_team) return if(!istype(new_team)) @@ -43,7 +43,7 @@ /datum/antagonist/wizard/get_team() return wiz_team -/datum/objective_team/wizard +/datum/team/wizard name = "wizard team" var/datum/antagonist/wizard/master_wizard @@ -307,18 +307,18 @@ parts += "The wizard was successful!" else parts += "The wizard has failed!" - + if(owner.spell_list.len>0) parts += "[owner.name] used the following spells: " var/list/spell_names = list() for(var/obj/effect/proc_holder/spell/S in owner.spell_list) spell_names += S.name parts += spell_names.Join(", ") - + return parts.Join("
    ") //Wizard with apprentices report -/datum/objective_team/wizard/roundend_report() +/datum/team/wizard/roundend_report() var/list/parts = list() parts += "Wizards/witches of [master_wizard.owner.name] team were:" @@ -326,5 +326,5 @@ parts += " " parts += "[master_wizard.owner.name] apprentices were:" parts += printplayerlist(members - master_wizard.owner) - + return "
    [parts.Join("
    ")]
    " \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index dbbb30e231..231ce66f28 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -149,7 +149,7 @@ return LAZYADD(antag_datums, A) A.create_team(team) - var/datum/objective_team/antag_team = A.get_team() + var/datum/team/antag_team = A.get_team() if(antag_team) antag_team.add_member(src) A.on_gain() @@ -206,7 +206,7 @@ var/datum/antagonist/nukeop/nuke = has_antag_datum(/datum/antagonist/nukeop,TRUE) if(nuke) remove_antag_datum(nuke.type) -special_role = null + special_role = null /datum/mind/proc/remove_wizard() remove_antag_datum(/datum/antagonist/wizard) @@ -333,7 +333,7 @@ special_role = null N.send_to_spawnpoint = FALSE N.nukeop_outfit = null add_antag_datum(N,converter.nuke_team) - + enslaved_to = creator @@ -775,13 +775,13 @@ special_role = null objective = locate(href_list["obj_edit"]) if (!objective) return - + for(var/datum/antagonist/A in antag_datums) if(objective in A.objectives) target_antag = A objective_pos = A.objectives.Find(objective) break - + if(!target_antag) //Shouldn't happen stack_trace("objective without antagonist found") objective_pos = objectives.Find(objective) @@ -943,7 +943,7 @@ special_role = null var/datum/objective/objective = locate(href_list["obj_delete"]) if(!istype(objective)) return - + for(var/datum/antagonist/A in antag_datums) if(objective in A.objectives) A.objectives -= objective diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index e413f0ebaf..d8ba1f5fa1 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -73,7 +73,7 @@ C.prefs.copy_to(M) M.key = C.key var/datum/mind/app_mind = M.mind - + var/datum/antagonist/wizard/apprentice/app = new(app_mind) app.master = user app.school = kind @@ -165,7 +165,7 @@ var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) if(!creator_op) return - + switch(borg_to_spawn) if("Medical") R = new /mob/living/silicon/robot/modules/syndicate/medical(T) @@ -187,7 +187,7 @@ R.real_name = R.name R.key = C.key - + var/datum/antagonist/nukeop/new_borg = new(R.mind) new_borg.send_to_spawnpoint = FALSE R.mind.add_antag_datum(new_borg,creator_op.nuke_team) diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index 978f871ba2..609f5bb6ab 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -1,6 +1,6 @@ /datum/game_mode var/list/datum/mind/brothers = list() - var/list/datum/objective_team/brother_team/brother_teams = list() + var/list/datum/team/brother_team/brother_teams = list() /datum/game_mode/traitor/bros name = "traitor+brothers" @@ -13,7 +13,7 @@ Blood Brothers: Accomplish your objectives.\n\ Crew: Do not let the traitors or brothers succeed!" - var/list/datum/objective_team/brother_team/pre_brother_teams = list() + var/list/datum/team/brother_team/pre_brother_teams = list() var/const/team_amount = 2 //hard limit on brother teams if scaling is turned off var/const/min_team_size = 2 traitors_required = FALSE //Only teams are possible @@ -36,7 +36,7 @@ for(var/j = 1 to num_teams) if(possible_brothers.len < min_team_size || antag_candidates.len <= required_enemies) break - var/datum/objective_team/brother_team/team = new + var/datum/team/brother_team/team = new var/team_size = prob(10) ? min(3, possible_brothers.len) : 2 for(var/k = 1 to team_size) var/datum/mind/bro = pick(possible_brothers) @@ -49,7 +49,7 @@ return ..() /datum/game_mode/traitor/bros/post_setup() - for(var/datum/objective_team/brother_team/team in pre_brother_teams) + for(var/datum/team/brother_team/team in pre_brother_teams) team.meeting_area = pick(meeting_areas) meeting_areas -= team.meeting_area team.forge_brother_objectives() diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 778cf41022..e4f75ea563 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -112,8 +112,8 @@ Credit where due: var/servants_to_serve = list() var/roundstart_player_count var/ark_time //In minutes, how long the Ark waits before activation; this is equal to 30 + (number of players / 5) (max 40 mins.) - - var/datum/objective_team/clockcult/main_clockcult + + var/datum/team/clockcult/main_clockcult /datum/game_mode/clockwork_cult/pre_setup() if(CONFIG_GET(flag/protect_roles_from_antagonist)) @@ -189,10 +189,9 @@ Credit where due: return FALSE /datum/game_mode/clockwork_cult/check_finished() - var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar - if(G && !GLOB.ratvar_awakens) // Doesn't end until the Ark is destroyed or completed + if(GLOB.ark_of_the_clockwork_justiciar && !GLOB.ratvar_awakens) // Doesn't end until the Ark is destroyed or completed return FALSE - . = ..() + return ..() /datum/game_mode/clockwork_cult/proc/check_clockwork_victory() return main_clockcult.check_clockwork_victory() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 67e2225772..697a5c8eba 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -6,13 +6,13 @@ /proc/iscultist(mob/living/M) return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CULT) -/datum/objective_team/cult/proc/is_sacrifice_target(datum/mind/mind) +/datum/team/cult/proc/is_sacrifice_target(datum/mind/mind) for(var/datum/objective/sacrifice/sac_objective in objectives) if(mind == sac_objective.target) return TRUE return FALSE - -/proc/is_convertable_to_cult(mob/living/M,datum/objective_team/cult/specific_cult) + +/proc/is_convertable_to_cult(mob/living/M,datum/team/cult/specific_cult) if(!istype(M)) return FALSE if(M.mind) @@ -54,7 +54,7 @@ var/list/cultists_to_cult = list() //the cultists we'll convert - var/datum/objective_team/cult/main_cult + var/datum/team/cult/main_cult /datum/game_mode/cult/pre_setup() @@ -96,7 +96,7 @@ var/datum/antagonist/cult/new_cultist = new(cult_mind) new_cultist.give_equipment = equip - + if(cult_mind.add_antag_datum(new_cultist)) if(stun) cult_mind.current.Unconscious(100) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 2938f5abf4..b809f2419c 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -30,7 +30,7 @@ user.whisper("O bidai nabora se[pick("'","`")]sma!", language = /datum/language/common) user.whisper(html_decode(message)) var/title = "Acolyte" - var/span = "cultitalic" + var/span = "cult italic" if(user.mind && user.mind.has_antag_datum(ANTAG_DATUM_CULT_MASTER)) span = "cultlarge" if(ishuman(user)) @@ -97,7 +97,7 @@ var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) pollCultists(owner,C.cult_team) -/proc/pollCultists(var/mob/living/Nominee,datum/objective_team/cult/team) //Cult Master Poll +/proc/pollCultists(var/mob/living/Nominee,datum/team/cult/team) //Cult Master Poll if(world.time < CULT_POLL_WAIT) to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return @@ -276,7 +276,7 @@ return FALSE var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - + if(target in view(7, get_turf(ranged_ability_user))) C.cult_team.blood_target = target var/area/A = get_area(target) @@ -297,7 +297,7 @@ return TRUE return FALSE -/proc/reset_blood_target(datum/objective_team/cult/team) +/proc/reset_blood_target(datum/team/cult/team) for(var/datum/mind/B in team.members) if(B.current && B.current.stat != DEAD && B.current.client) if(team.blood_target) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index fc6a36376b..ff85499029 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -407,8 +407,8 @@ structure_check() searches for nearby cultist structures required for the invoca var/datum/antagonist/cult/C = first_invoker.mind.has_antag_datum(/datum/antagonist/cult,TRUE) if(!C) return - - + + var/big_sac = FALSE if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) for(var/M in invokers) @@ -510,10 +510,10 @@ structure_check() searches for nearby cultist structures required for the invoca message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod") ..() -//Rite of Resurrection: Requires a dead or inactive cultist. When reviving the dead, you can only perform one revival for every sacrifice your cult has carried out. +//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people GLOB.sacrificed /obj/effect/rune/raise_dead - cultist_name = "Revive Cultist" - cultist_desc = "requires a dead, mindless, or inactive cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be given a new life." + cultist_name = "Resurrect Cultist" + cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived." invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below icon_state = "1" color = RUNE_COLOR_MEDIUMRED @@ -534,11 +534,16 @@ structure_check() searches for nearby cultist structures required for the invoca return rune_in_use = TRUE for(var/mob/living/M in T.contents) - if(iscultist(M) && (M.stat == DEAD || !M.client || M.client.is_afk())) + if(iscultist(M) && M.stat == DEAD) potential_revive_mobs |= M if(!potential_revive_mobs.len) to_chat(user, "There are no dead cultists on the rune!") - log_game("Raise Dead rune failed - no cultists to revive") + log_game("Raise Dead rune failed - no corpses to revive") + fail_invoke() + rune_in_use = FALSE + return + if(LAZYLEN(GLOB.sacrificed) <= revives_used) + to_chat(user, "You have sacrificed too few people to revive a cultist!") fail_invoke() rune_in_use = FALSE return @@ -554,25 +559,9 @@ structure_check() searches for nearby cultist structures required for the invoca else invocation = initial(invocation) ..() - if(mob_to_revive.stat == DEAD) - if(LAZYLEN(GLOB.sacrificed) <= revives_used) - to_chat(user, "Your cult must carry out another sacrifice before it can revive a cultist!") - fail_invoke() - rune_in_use = FALSE - return - revives_used++ - mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it! - mob_to_revive.grab_ghost() - else if(!mob_to_revive.client || mob_to_revive.client.is_afk()) - set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [mob_to_revive.name], an inactive blood cultist?", "[name]", null, "Blood Cultist", 50, mob_to_revive) - var/mob/dead/observer/theghost = null - if(candidates.len) - theghost = pick(candidates) - to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.") - message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.") - mob_to_revive.ghostize(0) - mob_to_revive.key = theghost.key + revives_used++ + mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it! + mob_to_revive.grab_ghost() to_chat(mob_to_revive, "\"PASNAR SAVRAE YAM'TOTH. Arise.\"") mob_to_revive.visible_message("[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.", \ "You awaken suddenly from the void. You're alive!") diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 344eb53507..a0e5a9f147 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -465,4 +465,4 @@ if(EMERGENCY_ESCAPED_OR_ENDGAMED) SSticker.news_report = STATION_EVACUATED if(SSshuttle.emergency.is_hijacked()) - SSticker.news_report = SHUTTLE_HIJACK + SSticker.news_report = SHUTTLE_HIJACK \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 050cac443d..f9e8f8d752 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -10,7 +10,7 @@ required_players = 15 maximum_players = 50 var/max_teams = 4 - var/list/datum/objective_team/abductor_team/abductor_teams = list() + var/list/datum/team/abductor_team/abductor_teams = list() var/finished = FALSE var/static/team_count = 0 @@ -37,7 +37,7 @@ if(team_number > max_teams) return //or should it try to stuff them in anway ? - var/datum/objective_team/abductor_team/team = new + var/datum/team/abductor_team/team = new team.team_number = team_number team.name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names team.add_objective(new/datum/objective/experiment) @@ -50,6 +50,7 @@ antag_candidates -= scientist team.members |= scientist scientist.assigned_role = "Abductor Scientist" + scientist.special_role = "Abductor Scientist" log_game("[scientist.key] (ckey) has been selected as [team.name] abductor scientist.") if(!agent) @@ -57,18 +58,19 @@ antag_candidates -= agent team.members |= agent agent.assigned_role = "Abductor Agent" + agent.special_role = "Abductor Agent" log_game("[agent.key] (ckey) has been selected as [team.name] abductor agent.") abductor_teams += team return team /datum/game_mode/abduction/post_setup() - for(var/datum/objective_team/abductor_team/team in abductor_teams) + for(var/datum/team/abductor_team/team in abductor_teams) post_setup_team(team) return ..() //Used for create antag buttons -/datum/game_mode/abduction/proc/post_setup_team(datum/objective_team/abductor_team/team) +/datum/game_mode/abduction/proc/post_setup_team(datum/team/abductor_team/team) for(var/datum/mind/M in team.members) if(M.assigned_role == "Abductor Scientist") M.add_antag_datum(ANTAG_DATUM_ABDUCTOR_SCIENTIST, team) @@ -77,7 +79,7 @@ /datum/game_mode/abduction/check_finished() if(!finished) - for(var/datum/objective_team/abductor_team/team in abductor_teams) + for(var/datum/team/abductor_team/team in abductor_teams) for(var/datum/objective/O in team.objectives) if(O.check_completion()) SSshuttle.emergency.request(null, set_coefficient = 0.5) @@ -101,9 +103,9 @@ /datum/objective/experiment/check_completion() for(var/obj/machinery/abductor/experiment/E in GLOB.machines) - if(!istype(team, /datum/objective_team/abductor_team)) + if(!istype(team, /datum/team/abductor_team)) return FALSE - var/datum/objective_team/abductor_team/T = team + var/datum/team/abductor_team/T = team if(E.team_number == T.team_number) return E.points >= target_amount return FALSE diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 4fcde56a72..890a3bb456 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -17,7 +17,7 @@ var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/list/pre_nukeops = list() - var/datum/objective_team/nuclear/nuke_team + var/datum/team/nuclear/nuke_team /datum/game_mode/nuclear/pre_setup() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) @@ -69,7 +69,8 @@ return FALSE //its a static var btw ..() -/datum/game_mode/nuclear/declare_completion() +/datum/game_mode/nuclear/set_round_result() + ..() var result = nuke_team.get_result() switch(result) if(NUKE_RESULT_FLUKE) @@ -102,22 +103,12 @@ else SSticker.mode_result = "halfwin - interrupted" SSticker.news_report = OPERATIVE_SKIRMISH - return ..() /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." -/datum/game_mode/proc/auto_declare_completion_nuclear() - var/list/nuke_teams = list() - for(var/datum/antagonist/nukeop/N in GLOB.antagonists) //collect all nuke teams - nuke_teams |= N.nuke_team - for(var/datum/objective_team/nuclear/nuke_team in nuke_teams) - nuke_team.roundend_display() - return TRUE - - /proc/is_nuclear_operative(mob/M) return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop) @@ -132,7 +123,8 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/storage/box/syndie=1) + backpack_contents = list(/obj/item/storage/box/syndie=1,\ + /obj/item/kitchen/knife/combat/survival) var/tc = 25 var/command_radio = FALSE @@ -177,4 +169,5 @@ r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ - /obj/item/gun/ballistic/automatic/pistol=1) + /obj/item/gun/ballistic/automatic/pistol=1,\ + /obj/item/kitchen/knife/combat/survival) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index cbfdb98c69..f20e16b36b 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -26,7 +26,7 @@ var/finished = 0 var/check_counter = 0 var/max_headrevs = 3 - var/datum/objective_team/revolution/revolution + var/datum/team/revolution/revolution var/list/datum/mind/headrev_candidates = list() /////////////////////////// diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 92c01bc241..8b80b9ab69 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -64,7 +64,6 @@ to_chat(user, "\"Come now, do not capture your bretheren's soul.\"") return add_logs(user, M, "captured [M.name]'s soul", src) - transfer_soul("VICTIM", M, user) ///////////////////Options for using captured souls/////////////////////////////////////// diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index b5d908d669..2a3812be3b 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -524,7 +524,7 @@ if(SSticker.mode.brother_teams.len > 0) dat += "
    Syndicates
    [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]
    " - for(var/datum/objective_team/brother_team/team in SSticker.mode.brother_teams) + for(var/datum/team/brother_team/team in SSticker.mode.brother_teams) for(var/datum/mind/brother in team.members) var/mob/M = brother.current if(M) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 1d60f4f28d..ece3775872 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -240,14 +240,13 @@ //Let's find the spawn locations var/leader_chosen = FALSE - - var/datum/objective_team/nuclear/nuke_team + var/datum/team/nuclear/nuke_team for(var/mob/c in chosen) var/mob/living/carbon/human/new_character=makeBody(c) if(!leader_chosen) leader_chosen = TRUE var/datum/antagonist/nukeop/N = new_character.mind.add_antag_datum(/datum/antagonist/nukeop/leader) - nuke_team = N.nuke_team + nuke_team = N.nuke_team else new_character.mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) return 1 @@ -309,13 +308,13 @@ //Assign antag status and the mission SSticker.mode.traitors += Commando.mind Commando.mind.special_role = "deathsquad" - + var/datum/objective/missionobj = new missionobj.owner = Commando.mind missionobj.explanation_text = mission missionobj.completed = 1 Commando.mind.objectives += missionobj - + Commando.mind.add_antag_datum(/datum/antagonist/auto_custom) //Greet the commando @@ -364,13 +363,13 @@ //Assign antag status and the mission SSticker.mode.traitors += newmob.mind newmob.mind.special_role = "official" - + var/datum/objective/missionobj = new missionobj.owner = newmob.mind missionobj.explanation_text = mission missionobj.completed = 1 newmob.mind.objectives += missionobj - + newmob.mind.add_antag_datum(/datum/antagonist/auto_custom) if(CONFIG_GET(flag/enforce_human_authority)) @@ -472,7 +471,7 @@ //Assign antag status and the mission SSticker.mode.traitors += ERTOperative.mind ERTOperative.mind.special_role = "ERT" - + var/datum/objective/missionobj = new missionobj.owner = ERTOperative.mind missionobj.explanation_text = mission diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 9801e98614..15b76d2641 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -50,7 +50,7 @@ var/list/all_cults = list() for(var/datum/antagonist/cult/C in GLOB.antagonists) all_cults |= C.cult_team - for(var/datum/objective_team/cult/T in all_cults) + for(var/datum/team/cult/T in all_cults) deltimer(T.blood_target_reset_timer) T.blood_target = src var/datum/objective/eldergod/summon_objective = locate() in T.objectives diff --git a/tgstation.dme b/tgstation.dme index 98b6a4dcab..64e5b2c686 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -490,6 +490,7 @@ #include "code\game\gamemodes\antag_hud.dm" #include "code\game\gamemodes\antag_spawner.dm" #include "code\game\gamemodes\antag_spawner_cit.dm" +#include "code\game\gamemodes\antag_team.dm" #include "code\game\gamemodes\cit_objectives.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" @@ -1305,8 +1306,8 @@ #include "code\modules\client\client_colour.dm" #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" -#include "code\modules\client\player_details.dm" #include "code\modules\client\message.dm" +#include "code\modules\client\player_details.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_toggles.dm" From b83dd9330999929f7943809c8440a3996404d2cf Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Wed, 20 Dec 2017 06:55:42 -0500 Subject: [PATCH 88/97] lizard stuff (#33669) --- code/modules/mob/living/carbon/human/species_types/humans.dm | 5 +++++ .../mob/living/carbon/human/species_types/lizardpeople.dm | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index fe0acc4feb..31883b4dcd 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -19,6 +19,11 @@ if(H) H.endTailWag() +/datum/species/human/spec_stun(mob/living/carbon/human/H,amount) + if(H) + H.endTailWag() + . = ..() + /datum/species/human/space_move(mob/living/carbon/human/H) var/obj/item/device/flightpack/F = H.get_flightpack() if(istype(F) && (F.flight) && F.allow_thrust(0.01, src)) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 257abf63d0..0d006196aa 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -42,6 +42,11 @@ if(H) H.endTailWag() +/datum/species/lizard/spec_stun(mob/living/carbon/human/H,amount) + if(H) + H.endTailWag() + . = ..() + /* Lizard subspecies: ASHWALKERS */ From 2c4e5bae9e36b64f37454e41e46d0aa4e703332f Mon Sep 17 00:00:00 2001 From: jughu Date: Wed, 20 Dec 2017 19:02:02 +0100 Subject: [PATCH 90/97] Fixes grammer issue (#33679) --- code/modules/research/designs/autolathe_designs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 39fd0bf182..ff2ccc938f 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -681,7 +681,7 @@ category = list("hacked", "Security") /datum/design/a357 - name = "Ammo Box (.357)" + name = "Speed Loader (.357)" id = "a357" build_type = AUTOLATHE materials = list(MAT_METAL = 30000) From 84f51a8cbbd6aad92d06010b4cbead01d8006c06 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 20 Dec 2017 13:24:06 -0600 Subject: [PATCH 92/97] antag team --- code/game/gamemodes/antag_team.dm | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 code/game/gamemodes/antag_team.dm diff --git a/code/game/gamemodes/antag_team.dm b/code/game/gamemodes/antag_team.dm new file mode 100644 index 0000000000..372ee26dfa --- /dev/null +++ b/code/game/gamemodes/antag_team.dm @@ -0,0 +1,34 @@ +//A barebones antagonist team. +/datum/team + var/list/datum/mind/members = list() + var/name = "team" + var/member_name = "member" + var/list/objectives = list() //common objectives, these won't be added or removed automatically, subtypes handle this, this is here for bookkeeping purposes. + +/datum/team/New(starting_members) + . = ..() + if(starting_members) + if(islist(starting_members)) + for(var/datum/mind/M in starting_members) + add_member(M) + else + add_member(starting_members) + +/datum/team/proc/is_solo() + return members.len == 1 + +/datum/team/proc/add_member(datum/mind/new_member) + members |= new_member + +/datum/team/proc/remove_member(datum/mind/member) + members -= member + +//Display members/victory/failure/objectives for the team +/datum/team/proc/roundend_report() + var/list/report = list() + + report += "[name]:" + report += "The [member_name]s were:" + report += printplayerlist(members) + + return report.Join("
    ") \ No newline at end of file From 48de10d250307e90246cded9ccddbc70d93d4547 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Dec 2017 21:25:02 -0600 Subject: [PATCH 93/97] Automatic changelog generation for PR #4467 [ci skip] --- html/changelogs/AutoChangeLog-pr-4467.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4467.yml diff --git a/html/changelogs/AutoChangeLog-pr-4467.yml b/html/changelogs/AutoChangeLog-pr-4467.yml new file mode 100644 index 0000000000..ae009bf26f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4467.yml @@ -0,0 +1,4 @@ +author: "improvedname" +delete-after: True +changes: + - bugfix: "Corrects 357. speedloader in the autolathe" From 9273eeb83231e782284c7e3cf00a525f0647ee9e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Dec 2017 21:25:43 -0600 Subject: [PATCH 94/97] Automatic changelog generation for PR #4464 [ci skip] --- html/changelogs/AutoChangeLog-pr-4464.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4464.yml diff --git a/html/changelogs/AutoChangeLog-pr-4464.yml b/html/changelogs/AutoChangeLog-pr-4464.yml new file mode 100644 index 0000000000..17f7d8fc07 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4464.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "You can enforce no smoking zones with a disarm aimed at the smokers mouth." From 425c4314c0197a49f47abc64c504a0b39f705650 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Dec 2017 21:30:24 -0600 Subject: [PATCH 95/97] Automatic changelog generation for PR #4453 [ci skip] --- html/changelogs/AutoChangeLog-pr-4453.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4453.yml diff --git a/html/changelogs/AutoChangeLog-pr-4453.yml b/html/changelogs/AutoChangeLog-pr-4453.yml new file mode 100644 index 0000000000..24bce9c510 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4453.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "A changeling will learn all languages from anyone they absorb." From f3e7f5f2fd2e1634c7cebc1e9c708944ee312189 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Dec 2017 21:42:40 -0600 Subject: [PATCH 96/97] Automatic changelog generation for PR #4420 [ci skip] --- html/changelogs/AutoChangeLog-pr-4420.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4420.yml diff --git a/html/changelogs/AutoChangeLog-pr-4420.yml b/html/changelogs/AutoChangeLog-pr-4420.yml new file mode 100644 index 0000000000..305d701c7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4420.yml @@ -0,0 +1,10 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "A few new traumas have been added." + - balance: "Thresholds to get brain traumas have been lowered, as they currently pretty much only trigger if you intentionally chug impedrezene." + - tweak: "Melee head hits deal minor brain damage. Crits still do a significant amount." + - tweak: "Nuke Op implants no longer trigger on deathgasp. (They still explode on death)" + - tweak: "You'll now receive messages when crossing certain brain damage thresholds." + - tweak: "Split Personalities are instructed not to suicide while in control." + - tweak: "Godwoken Syndrome now randomly sends Voice of God commands, instead of being controllable." From 408cf32ddc3cd189656d45fedb1d4c8ffdbae011 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 20 Dec 2017 21:47:52 -0600 Subject: [PATCH 97/97] Automatic changelog generation for PR #4445 [ci skip] --- html/changelogs/AutoChangeLog-pr-4445.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4445.yml diff --git a/html/changelogs/AutoChangeLog-pr-4445.yml b/html/changelogs/AutoChangeLog-pr-4445.yml new file mode 100644 index 0000000000..6dd7a7e486 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4445.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixed captain's PDA showing unusable Toggle Remote Door menu option"
    Brothers