Merge remote-tracking branch 'upstream/master' into admin_mapsave
This commit is contained in:
@@ -5,10 +5,6 @@
|
||||
#define NONE 0
|
||||
|
||||
//for convenience
|
||||
#define ENABLE_BITFIELD(variable, flag) (variable |= (flag))
|
||||
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
|
||||
#define CHECK_BITFIELD(variable, flag) (variable & (flag))
|
||||
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))
|
||||
#define COPY_SPECIFIC_BITFIELDS(a,b,flags)\
|
||||
do{\
|
||||
var/_old = a & ~(flags);\
|
||||
@@ -154,7 +150,7 @@ GLOBAL_LIST_INIT(bitflags, list(
|
||||
|
||||
//Mob mobility var flags
|
||||
/// any flag
|
||||
#define CHECK_MOBILITY(target, flags) CHECK_BITFIELD(target.mobility_flags, flags)
|
||||
#define CHECK_MOBILITY(target, flags) (target.mobility_flags & flags)
|
||||
#define CHECK_ALL_MOBILITY(target, flags) CHECK_MULTIPLE_BITFIELDS(target.mobility_flags, flags)
|
||||
|
||||
/// can move
|
||||
|
||||
@@ -119,6 +119,8 @@
|
||||
|
||||
#define STATUS_EFFECT_CLOUDSTRUCK /datum/status_effect/cloudstruck //blinds and applies an overlay.
|
||||
|
||||
#define STATUS_EFFECT_GAUNTLET_CONC /datum/status_effect/cgau_conc // it's a slowdown that really should only be applying to large simplemobs
|
||||
|
||||
/// shoves inflict this to indicate the next shove while this is in effect should disarm guns
|
||||
#define STATUS_EFFECT_OFF_BALANCE /datum/status_effect/off_balance
|
||||
|
||||
|
||||
@@ -173,23 +173,20 @@
|
||||
/proc/typecache_filter_list(list/atoms, list/typecache)
|
||||
RETURN_TYPE(/list)
|
||||
. = list()
|
||||
for(var/thing in atoms)
|
||||
var/atom/A = thing
|
||||
for(var/atom/A as anything in atoms)
|
||||
if (typecache[A.type])
|
||||
. += A
|
||||
|
||||
/proc/typecache_filter_list_reverse(list/atoms, list/typecache)
|
||||
RETURN_TYPE(/list)
|
||||
. = list()
|
||||
for(var/thing in atoms)
|
||||
var/atom/A = thing
|
||||
for(var/atom/A as anything in atoms)
|
||||
if(!typecache[A.type])
|
||||
. += A
|
||||
|
||||
/proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude)
|
||||
. = list()
|
||||
for(var/thing in atoms)
|
||||
var/atom/A = thing
|
||||
for(var/atom/A as anything in atoms)
|
||||
if(typecache_include[A.type] && !typecache_exclude[A.type])
|
||||
. += A
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
|
||||
for(var/gpath in subtypesof(/obj/item/organ/genital))
|
||||
var/obj/item/organ/genital/G = gpath
|
||||
if(!CHECK_BITFIELD(initial(G.genital_flags), GENITAL_BLACKLISTED))
|
||||
if(!(initial(G.genital_flags) & GENITAL_BLACKLISTED))
|
||||
GLOB.genitals_list[initial(G.name)] = gpath
|
||||
//END OF CIT CHANGES
|
||||
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
var/obj/item/clothing/mask/M = check
|
||||
if(M.mask_adjusted)
|
||||
M.adjustmask(C)
|
||||
if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
|
||||
if((check.clothing_flags & ALLOWINTERNALS))
|
||||
internals = TRUE
|
||||
if(!internals)
|
||||
to_chat(C, "<span class='warning'>You are not wearing an internals mask!</span>")
|
||||
|
||||
@@ -260,7 +260,7 @@
|
||||
return clamp((1.5 + (w_class/5)) * ((force_override || force) / 1.5), 0, 10 SECONDS) * CONFIG_GET(number/melee_stagger_factor)
|
||||
|
||||
/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user, force_override)
|
||||
if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER))
|
||||
if(!(target.status_flags & CANSTAGGER))
|
||||
return FALSE
|
||||
if(target.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
target.do_staggered_animation()
|
||||
|
||||
@@ -326,7 +326,7 @@ SUBSYSTEM_DEF(vote)
|
||||
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
|
||||
GLOB.master_mode = "dynamic"
|
||||
if(. == "extended")
|
||||
GLOB.dynamic_forced_extended = TRUE
|
||||
GLOB.dynamic_extended = TRUE
|
||||
message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]")
|
||||
log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].")
|
||||
if("restart")
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
expire = _expire
|
||||
|
||||
/datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot)
|
||||
if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot))) //Check that the slot is valid for antimagic
|
||||
if(!(allowed_slots & slotdefine2slotbit(slot))) //Check that the slot is valid for antimagic
|
||||
UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC)
|
||||
return
|
||||
RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE)
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
new /obj/effect/temp_visual/heart(target.loc)
|
||||
if(pet_emote)
|
||||
target.emote("me", pet_type, pet_emote)
|
||||
if(pet_moodlet && !CHECK_BITFIELD(target.flags_1, HOLOGRAM_1)) //prevents unlimited happiness petting park exploit.
|
||||
if(pet_moodlet && !(target.flags_1 & HOLOGRAM_1)) //prevents unlimited happiness petting park exploit.
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, target, pet_moodlet, target)
|
||||
|
||||
/datum/element/wuv/proc/kick_the_dog(mob/target, mob/user)
|
||||
@@ -60,5 +60,5 @@
|
||||
return
|
||||
if(punt_emote)
|
||||
target.emote("me", punt_type, punt_emote)
|
||||
if(punt_moodlet && !CHECK_BITFIELD(target.flags_1, HOLOGRAM_1))
|
||||
if(punt_moodlet && !(target.flags_1 & HOLOGRAM_1))
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, target, punt_moodlet, target)
|
||||
|
||||
+1
-1
@@ -141,7 +141,7 @@
|
||||
if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.
|
||||
var/mob/living/L = new_character
|
||||
if(L.client?.prefs && L.client.prefs.auto_ooc && L.client.prefs.chat_toggles & CHAT_OOC)
|
||||
DISABLE_BITFIELD(L.client.prefs.chat_toggles,CHAT_OOC)
|
||||
L.client.prefs.chat_toggles &= ~(CHAT_OOC)
|
||||
|
||||
hide_ckey = current.client?.prefs?.hide_ckey
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
))
|
||||
if(!can_contaminate || blacklisted[thing.type])
|
||||
continue
|
||||
if(CHECK_BITFIELD(thing.rad_flags, RAD_NO_CONTAMINATE) || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION)
|
||||
if((thing.rad_flags & RAD_NO_CONTAMINATE) || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION)
|
||||
continue
|
||||
contam_atoms += thing
|
||||
var/did_contam = 0
|
||||
|
||||
@@ -1132,3 +1132,16 @@
|
||||
else if(fake_msg)
|
||||
to_chat(owner, fake_msg)
|
||||
msg_stage++
|
||||
|
||||
/datum/status_effect/cgau_conc
|
||||
id = "cgau_conc"
|
||||
examine_text = "<span class='warning'>SUBJECTPRONOUN rocks from side to side, confused.</span>"
|
||||
duration = 5 SECONDS
|
||||
|
||||
/datum/status_effect/cgau_conc/on_creation(mob/living/new_owner, ...)
|
||||
. = ..()
|
||||
new_owner.add_movespeed_modifier(/datum/movespeed_modifier/gauntlet_concussion)
|
||||
|
||||
/datum/status_effect/cgau_conc/on_remove()
|
||||
owner.remove_movespeed_modifier(/datum/movespeed_modifier/gauntlet_concussion)
|
||||
. = ..()
|
||||
|
||||
+15
-15
@@ -319,38 +319,38 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
*
|
||||
* Sends to all ai players, alert consoles, drones and alarm monitor programs in the world
|
||||
*/
|
||||
/area/proc/poweralert(state, obj/source)
|
||||
/area/proc/poweralert(set_alarm, obj/source)
|
||||
if (area_flags & NO_ALERTS)
|
||||
return
|
||||
if (state != poweralm)
|
||||
poweralm = state
|
||||
if (set_alarm != poweralm)
|
||||
poweralm = set_alarm
|
||||
if(istype(source)) //Only report power alarms on the z-level where the source is located.
|
||||
for (var/item in GLOB.silicon_mobs)
|
||||
var/mob/living/silicon/aiPlayer = item
|
||||
if (state == 1)
|
||||
aiPlayer.cancelAlarm("Power", src, source)
|
||||
else
|
||||
if (set_alarm)
|
||||
aiPlayer.triggerAlarm("Power", src, cameras, source)
|
||||
else
|
||||
aiPlayer.cancelAlarm("Power", src, source)
|
||||
|
||||
for (var/item in GLOB.alert_consoles)
|
||||
var/obj/machinery/computer/station_alert/a = item
|
||||
if(state == 1)
|
||||
a.cancelAlarm("Power", src, source)
|
||||
else
|
||||
if (set_alarm)
|
||||
a.triggerAlarm("Power", src, cameras, source)
|
||||
else
|
||||
a.cancelAlarm("Power", src, source)
|
||||
|
||||
for (var/item in GLOB.drones_list)
|
||||
var/mob/living/simple_animal/drone/D = item
|
||||
if(state == 1)
|
||||
D.cancelAlarm("Power", src, source)
|
||||
else
|
||||
if (set_alarm)
|
||||
D.triggerAlarm("Power", src, cameras, source)
|
||||
else
|
||||
D.cancelAlarm("Power", src, source)
|
||||
for(var/item in GLOB.alarmdisplay)
|
||||
var/datum/computer_file/program/alarm_monitor/p = item
|
||||
if(state == 1)
|
||||
p.cancelAlarm("Power", src, source)
|
||||
else
|
||||
if (set_alarm)
|
||||
p.triggerAlarm("Power", src, cameras, source)
|
||||
else
|
||||
p.cancelAlarm("Power", src, source)
|
||||
|
||||
/area/proc/atmosalert(danger_level, obj/source)
|
||||
if (area_flags & NO_ALERTS)
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
#define RULESET_STOP_PROCESSING 1
|
||||
|
||||
#define FAKE_REPORT_CHANCE 8
|
||||
#define FAKE_REPORT_CHANCE 20
|
||||
#define REPORT_NEG_DIVERGENCE -15
|
||||
#define REPORT_POS_DIVERGENCE 15
|
||||
#define EXTENDED_CURVE_CENTER -7
|
||||
|
||||
// Are HIGH_IMPACT_RULESETs allowed to stack?
|
||||
GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE)
|
||||
// If enabled does not accept or execute any rulesets.
|
||||
GLOBAL_VAR_INIT(dynamic_forced_extended, FALSE)
|
||||
// Antags still allowed, but no roundstart antags + midrounds are low impact
|
||||
GLOBAL_VAR_INIT(dynamic_extended, FALSE)
|
||||
// How high threat is required for HIGH_IMPACT_RULESETs stacking.
|
||||
// This is independent of dynamic_no_stacking.
|
||||
GLOBAL_VAR_INIT(dynamic_stacking_limit, 90)
|
||||
@@ -163,6 +166,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].<br/>"
|
||||
dat += "<i>On average, <b>[peaceful_percentage]</b>% of the rounds are more peaceful.</i><br/>"
|
||||
dat += "Forced extended: <a href='?src=\ref[src];[HrefToken()];forced_extended=1'><b>[GLOB.dynamic_forced_extended ? "On" : "Off"]</b></a><br/>"
|
||||
dat += "Dynamic extended: <a href='?src=\ref[src];[HrefToken()];extended=1'><b>[GLOB.dynamic_extended ? "On" : "Off"]</b></a><br/>"
|
||||
dat += "No stacking (only one round-ender): <a href='?src=\ref[src];[HrefToken()];no_stacking=1'><b>[GLOB.dynamic_no_stacking ? "On" : "Off"]</b></a><br/>"
|
||||
dat += "Stacking limit: [GLOB.dynamic_stacking_limit] <a href='?src=\ref[src];[HrefToken()];stacking_limit=1'>\[Adjust\]</A>"
|
||||
dat += "<br/>"
|
||||
@@ -192,6 +196,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
return
|
||||
if (href_list["forced_extended"])
|
||||
GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended
|
||||
else if (href_list["extended"])
|
||||
GLOB.dynamic_extended = !GLOB.dynamic_extended
|
||||
else if (href_list["no_stacking"])
|
||||
GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking
|
||||
else if (href_list["adjustthreat"])
|
||||
@@ -309,9 +315,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
|
||||
/// Generates the threat level using lorentz distribution and assigns peaceful_percentage.
|
||||
/datum/game_mode/dynamic/proc/generate_threat()
|
||||
if(GLOB.dynamic_extended)
|
||||
threat_curve_centre = EXTENDED_CURVE_CENTER
|
||||
var/relative_threat = LORENTZ_DISTRIBUTION(threat_curve_centre, threat_curve_width)
|
||||
threat_level = round(lorentz_to_amount(relative_threat), 0.1)
|
||||
|
||||
peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, threat_curve_centre, threat_curve_width), 0.01)*100
|
||||
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Initial threat level")
|
||||
@@ -321,14 +328,18 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
|
||||
/// Generates the midround and roundstart budgets
|
||||
/datum/game_mode/dynamic/proc/generate_budgets()
|
||||
var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width)
|
||||
round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1)
|
||||
initial_round_start_budget = round_start_budget
|
||||
mid_round_budget = threat_level - round_start_budget
|
||||
if(GLOB.dynamic_extended)
|
||||
mid_round_budget = threat_level
|
||||
round_start_budget = 0
|
||||
else
|
||||
var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width)
|
||||
round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1)
|
||||
initial_round_start_budget = round_start_budget
|
||||
mid_round_budget = threat_level - round_start_budget
|
||||
|
||||
/datum/game_mode/dynamic/proc/setup_parameters()
|
||||
log_game("DYNAMIC: Dynamic mode parameters for the round:")
|
||||
log_game("DYNAMIC: Centre is [threat_curve_centre], Width is [threat_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].")
|
||||
log_game("DYNAMIC: Centre is [threat_curve_centre], Width is [threat_curve_width], Extended is [GLOB.dynamic_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].")
|
||||
log_game("DYNAMIC: Stacking limit is [GLOB.dynamic_stacking_limit].")
|
||||
if(GLOB.dynamic_forced_threat_level >= 0)
|
||||
threat_level = round(GLOB.dynamic_forced_threat_level, 0.1)
|
||||
@@ -346,9 +357,15 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
shown_threat = clamp(threat_level + rand(REPORT_NEG_DIVERGENCE, REPORT_POS_DIVERGENCE), 0, 100)
|
||||
|
||||
/datum/game_mode/dynamic/proc/set_cooldowns()
|
||||
var/coeff = GLOB.dynamic_extended ? 2 : 1
|
||||
latejoin_delay_min *= coeff
|
||||
latejoin_delay_max *= coeff
|
||||
var/latejoin_injection_cooldown_middle = 0.5*(latejoin_delay_max + latejoin_delay_min)
|
||||
latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time
|
||||
|
||||
midround_delay_min *= coeff
|
||||
midround_delay_max *= coeff
|
||||
|
||||
var/midround_injection_cooldown_middle = 0.5*(midround_delay_max + midround_delay_min)
|
||||
midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), midround_delay_min, midround_delay_max)) + world.time
|
||||
|
||||
@@ -456,6 +473,9 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
if (GLOB.dynamic_forced_extended)
|
||||
log_game("DYNAMIC: Starting a round of forced extended.")
|
||||
return TRUE
|
||||
if (GLOB.dynamic_extended)
|
||||
log_game("DYNAMIC: Starting a round of dynamic extended.")
|
||||
return TRUE
|
||||
var/list/drafted_rules = list()
|
||||
for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules)
|
||||
if (!rule.weight)
|
||||
@@ -563,9 +583,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
return FALSE
|
||||
// Check if the ruleset is high impact and if a high impact ruleset has been executed
|
||||
else if(new_rule.flags & HIGH_IMPACT_RULESET)
|
||||
if(threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking)
|
||||
if(high_impact_ruleset_executed)
|
||||
return FALSE
|
||||
if(GLOB.dynamic_extended)
|
||||
return FALSE
|
||||
if(high_impact_ruleset_executed && threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking)
|
||||
return FALSE
|
||||
|
||||
var/population = current_players[CURRENT_LIVING_PLAYERS].len
|
||||
if((new_rule.acceptable(population, threat_level) && new_rule.cost <= mid_round_budget) || forced)
|
||||
@@ -598,8 +619,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
/datum/game_mode/dynamic/proc/midround_rule_draft()
|
||||
set waitfor = FALSE
|
||||
if (midround_injection_cooldown < world.time)
|
||||
/*if (GLOB.dynamic_forced_extended)
|
||||
return*/
|
||||
if (GLOB.dynamic_forced_extended)
|
||||
return
|
||||
|
||||
// Somehow it managed to trigger midround multiple times so this was moved here.
|
||||
// There is no way this should be able to trigger an injection twice now.
|
||||
@@ -620,6 +641,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
for (var/datum/dynamic_ruleset/midround/rule in midround_rules)
|
||||
if (!rule.weight)
|
||||
continue
|
||||
if(rule.flags & HIGH_IMPACT_RULESET)
|
||||
if (high_impact_ruleset_executed && threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking)
|
||||
continue
|
||||
if(GLOB.dynamic_extended)
|
||||
continue
|
||||
if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && mid_round_budget >= rule.cost)
|
||||
rule.trim_candidates()
|
||||
if (rule.ready())
|
||||
@@ -642,11 +668,17 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
|
||||
forced_injection = dry_run
|
||||
return 100
|
||||
var/chance = 0
|
||||
var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(current_players[CURRENT_LIVING_PLAYERS].len/5))
|
||||
var/effective_living_players = current_players[CURRENT_LIVING_PLAYERS].len
|
||||
if(GLOB.dynamic_extended)
|
||||
effective_living_players = min(effective_living_players, length(SSjob.get_living_sec())*2 + length(SSjob.get_living_heads()))
|
||||
var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(effective_living_players/5))
|
||||
if (!current_players[CURRENT_LIVING_ANTAGS].len)
|
||||
chance += 50 // No antags at all? let's boost those odds!
|
||||
if(GLOB.dynamic_extended)
|
||||
chance += min(50,effective_living_players*5)
|
||||
else
|
||||
chance += 50 // No antags at all? let's boost those odds!
|
||||
else
|
||||
var/current_pop_per_antag = current_players[CURRENT_LIVING_PLAYERS].len / current_players[CURRENT_LIVING_ANTAGS].len
|
||||
var/current_pop_per_antag = effective_living_players / current_players[CURRENT_LIVING_ANTAGS].len
|
||||
if (current_pop_per_antag > max_pop_per_antag)
|
||||
chance += min(50, 25+10*(current_pop_per_antag-max_pop_per_antag))
|
||||
else
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
required_candidates = 1
|
||||
weight = 7
|
||||
cost = 5
|
||||
requirements = list(40,30,20,10,10,10,10,10,10,10)
|
||||
requirements = list(101,40,25,20,15,10,10,10,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
//////////////////////////////////////////////
|
||||
@@ -159,5 +159,5 @@
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,101,101,50,40,10,10,10,10,10)
|
||||
requirements = list(101,101,101,50,40,20,20,15,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
antag_flag = ROLE_MALF
|
||||
enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer")
|
||||
exclusive_roles = list("AI")
|
||||
required_enemies = list(4,4,4,4,4,4,2,2,2,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 35
|
||||
@@ -304,11 +304,11 @@
|
||||
antag_flag = "wizard mid"
|
||||
antag_flag_override = ROLE_WIZARD
|
||||
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 2
|
||||
cost = 20
|
||||
requirements = list(101,101,100,80,50,30,20,10,10,10)
|
||||
requirements = list(101,101,100,60,40,20,20,20,10,10)
|
||||
repeatable = TRUE
|
||||
var/datum/mind/wizard
|
||||
|
||||
@@ -351,11 +351,11 @@
|
||||
antag_datum = /datum/antagonist/nukeop
|
||||
antag_flag_override = ROLE_OPERATIVE
|
||||
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(3,3,3,3,3,2,1,1,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 5
|
||||
weight = 3
|
||||
cost = 35
|
||||
requirements = list(101,101,101,80,50,40,30,15,10,10)
|
||||
requirements = list(101,101,101,60,40,30,20,15,10,10)
|
||||
var/list/operative_cap = list(2,2,3,3,3,4,5,5,5,5)
|
||||
var/datum/team/nuclear/nuke_team
|
||||
flags = HIGH_IMPACT_RULESET
|
||||
@@ -393,11 +393,11 @@
|
||||
antag_datum = /datum/antagonist/blob
|
||||
antag_flag = ROLE_BLOB
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 2
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,70,40,25,20,10,10)
|
||||
requirements = list(101,101,101,101,50,40,30,20,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant)
|
||||
@@ -412,11 +412,11 @@
|
||||
protected_roles = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 2
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,70,40,25,20,10,10)
|
||||
requirements = list(101,101,101,101,50,40,30,20,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/blob_infection/trim_candidates()
|
||||
@@ -450,11 +450,11 @@
|
||||
antag_datum = /datum/antagonist/xeno
|
||||
antag_flag = ROLE_ALIEN
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,60,50,30,20,10,10)
|
||||
requirements = list(101,101,101,101,50,40,30,20,10,10)
|
||||
repeatable = TRUE
|
||||
var/list/vents = list()
|
||||
|
||||
@@ -496,11 +496,11 @@
|
||||
antag_flag = "Nightmare"
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,101,101,40,30,20,10,10,10,10)
|
||||
requirements = list(101,101,50,30,25,20,10,10,10,10)
|
||||
repeatable = TRUE
|
||||
var/list/spawn_locs = list()
|
||||
|
||||
@@ -542,11 +542,11 @@
|
||||
antag_flag = ROLE_SPACE_DRAGON
|
||||
antag_flag_override = ROLE_SPACE_DRAGON
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,60,50,30,20,10,10)
|
||||
requirements = list(101,101,101,101,50,40,30,20,10,10)
|
||||
repeatable = TRUE
|
||||
var/list/spawn_locs = list()
|
||||
|
||||
@@ -586,12 +586,12 @@
|
||||
antag_flag = "Abductor"
|
||||
antag_flag_override = ROLE_ABDUCTOR
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 2
|
||||
required_applicants = 2
|
||||
weight = 3
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,101,40,25,20,10,10)
|
||||
requirements = list(101,101,101,101,101,30,20,15,10,10)
|
||||
repeatable = TRUE
|
||||
var/datum/team/abductor_team/new_team
|
||||
|
||||
@@ -625,11 +625,11 @@
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
required_type = /mob/dead/observer
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 0
|
||||
weight = 3
|
||||
cost = 10
|
||||
requirements = list(101,101,101,101,60,50,30,20,10,10)
|
||||
requirements = list(101,101,101,101,50,40,30,20,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/swarmers/execute()
|
||||
@@ -658,11 +658,11 @@
|
||||
antag_flag = "Space Ninja"
|
||||
antag_flag_override = ROLE_NINJA
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,101,101,80,60,50,30,20,10,10)
|
||||
requirements = list(101,101,101,60,50,30,10,10,10,10)
|
||||
repeatable = TRUE
|
||||
var/list/spawn_locs = list()
|
||||
|
||||
@@ -699,11 +699,11 @@
|
||||
antag_flag = "Revenant"
|
||||
antag_flag_override = ROLE_REVENANT
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,101,101,70,50,40,20,15,10,10)
|
||||
requirements = list(101,101,50,30,25,20,10,10,10,10)
|
||||
repeatable = TRUE
|
||||
var/dead_mobs_required = 20
|
||||
var/need_extra_spawns_value = 15
|
||||
@@ -748,7 +748,7 @@
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,101,101,70,50,40,20,15,10,10)
|
||||
requirements = list(101,101,50,30,25,20,10,10,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant)
|
||||
@@ -765,11 +765,11 @@
|
||||
antag_flag = "Space Pirates"
|
||||
required_type = /mob/dead/observer
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_enemies = list(0,0,0,0,0,0,0,0,0,0)
|
||||
required_candidates = 0
|
||||
weight = 4
|
||||
cost = 10
|
||||
requirements = list(101,101,101,50,40,25,10,10,10,10)
|
||||
requirements = list(101,101,101,40,30,20,10,10,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat=0)
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
weight = 3
|
||||
cost = 16
|
||||
scaling_cost = 10
|
||||
requirements = list(101,70,60,50,40,20,20,10,10,10)
|
||||
requirements = list(101,60,50,40,30,20,15,10,10,10)
|
||||
antag_cap = list("denominator" = 29)
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/changeling/pre_execute(population)
|
||||
@@ -138,7 +138,7 @@
|
||||
weight = 3
|
||||
cost = 15
|
||||
scaling_cost = 9
|
||||
requirements = list(101,101,101,55,40,25,20,15,10,10)//higher because of 'round end'
|
||||
requirements = list(101,101,101,50,40,20,20,15,10,10)//higher because of 'round end'
|
||||
antag_cap = list("denominator" = 24)
|
||||
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
cost = 20
|
||||
requirements = list(101,101,100,80,50,40,30,20,10,10)//100 because of configt, otherwise equal to nukies
|
||||
requirements = list(101,101,100,60,40,20,20,20,10,10)//100 because of configt, otherwise equal to nukies
|
||||
var/list/roundstart_wizards = list()
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/wizard/acceptable(population=0, threat=0)
|
||||
@@ -223,7 +223,7 @@
|
||||
weight = 2 //lower weight because of easy steamroll potential
|
||||
cost = 20
|
||||
//requirements = list(100,90,80,60,40,30,10,10,10,10)
|
||||
requirements = list(101,101,101,101,60,40,20,10,10,10)
|
||||
requirements = list(101,101,101,101,50,40,20,10,10,10)
|
||||
flags = HIGH_IMPACT_RULESET
|
||||
antag_cap = list("denominator" = 20, "offset" = 1)
|
||||
var/datum/team/cult/main_cult
|
||||
@@ -279,7 +279,7 @@
|
||||
required_candidates = 5
|
||||
weight = 3
|
||||
cost = 20
|
||||
requirements = list(101,101,101,80,50,40,30,15,10,10)
|
||||
requirements = list(101,101,101,60,40,30,20,15,10,10)
|
||||
flags = HIGH_IMPACT_RULESET
|
||||
antag_cap = list("denominator" = 18, "offset" = 1)
|
||||
var/datum/team/nuclear/nuke_team
|
||||
@@ -365,7 +365,7 @@
|
||||
weight = 2
|
||||
delay = 7 MINUTES
|
||||
cost = 20
|
||||
requirements = list(101,101,101,101,60,40,20,10,10,10)
|
||||
requirements = list(101,101,101,101,50,40,20,10,10,10)
|
||||
antag_cap = 3
|
||||
flags = HIGH_IMPACT_RULESET
|
||||
blocking_rules = list(/datum/dynamic_ruleset/latejoin/provocateur)
|
||||
@@ -445,7 +445,7 @@
|
||||
required_candidates = 2
|
||||
weight = 3 //higher weight than blood cult and revs because it's more balanced
|
||||
cost = 20
|
||||
requirements = list(101,101,101,101,60,40,20,10,10,10) //slightly higher than nukies
|
||||
requirements = list(101,101,101,101,50,40,20,10,10,10) //slightly higher than nukies
|
||||
flags = HIGH_IMPACT_RULESET
|
||||
antag_cap = list("denominator" = 20, "offset" = 1)
|
||||
var/datum/team/clockcult/main_clockcult
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
// like a recycler, but for plants only ig
|
||||
/obj/machinery/autoloom
|
||||
name = "autoloom"
|
||||
desc = "A large processing machine used to process raw biological matter, like cotton or logs. It also looks like a recycler. There's a display on the side."
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "grinder-o0"
|
||||
layer = ABOVE_ALL_MOB_LAYER // Overhead
|
||||
density = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/autoloom
|
||||
var/icon_name = "grinder-o"
|
||||
var/eat_dir = WEST
|
||||
var/process_efficiency = 0
|
||||
var/static/list/can_process = typecacheof(list(
|
||||
/obj/item/stack/sheet/cotton,
|
||||
/obj/item/grown/log,
|
||||
/obj/item/grown/cotton
|
||||
))
|
||||
|
||||
/obj/machinery/autoloom/RefreshParts()
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
process_efficiency = M.rating
|
||||
|
||||
/obj/machinery/recycler/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Biomatter processing efficiency at <b>[amount_produced*100]%</b>.</span>"
|
||||
|
||||
/obj/machinery/autoloom/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/autoloom/attackby(obj/item/I, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
|
||||
return
|
||||
|
||||
if(default_pry_open(I))
|
||||
return
|
||||
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/autoloom/update_icon_state()
|
||||
var/is_powered = !(stat & (BROKEN|NOPOWER))
|
||||
icon_state = icon_name + "[is_powered]" // add the blood tag at the end
|
||||
|
||||
/obj/machinery/autoloom/CanPass(atom/movable/AM)
|
||||
. = ..()
|
||||
if(!anchored)
|
||||
return
|
||||
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
if(move_dir == eat_dir)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/autoloom/Crossed(atom/movable/AM)
|
||||
eat(AM)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/autoloom/proc/eat(atom/movable/AM0, sound=TRUE)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(!isturf(AM0.loc))
|
||||
return //I don't know how you called Crossed() but stop it.
|
||||
|
||||
if(is_type_in_list(AM0, can_process))
|
||||
process_item(AM0)
|
||||
|
||||
/obj/machinery/autoloom/proc/process_item(obj/item/I)
|
||||
. = list()
|
||||
for(var/A in I)
|
||||
var/atom/movable/AM = A
|
||||
AM.forceMove(loc)
|
||||
if(AM.loc == loc)
|
||||
. += AM
|
||||
|
||||
I.forceMove(loc)
|
||||
if(istype(I, /obj/item/grown/log))
|
||||
var/obj/item/grown/log/L = I
|
||||
var/seed_modifier = 0
|
||||
if(L.seed)
|
||||
seed_modifier = round(L.seed.potency / 25)
|
||||
new L.plank_type(src.loc, process_efficiency + seed_modifier)
|
||||
qdel(L)
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/stack/sheet/cotton))
|
||||
var/obj/item/stack/sheet/cotton/RS = I
|
||||
var/tomake = round((RS.amount / 4) * process_efficiency)
|
||||
new RS.loom_result(src.loc, tomake)
|
||||
qdel(RS)
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/grown/cotton))
|
||||
var/obj/item/grown/cotton/RC = I
|
||||
var/cottonAmt = 1 + round(RC.seed.potency / 25)
|
||||
var/newRaw = new RC.cotton_type(src.loc, cottonAmt)
|
||||
qdel(RC)
|
||||
process_item(newRaw)
|
||||
return
|
||||
@@ -82,9 +82,8 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
|
||||
// If it's a generic arcade machine, pick a random arcade
|
||||
// circuit board for it and make the new machine
|
||||
if(!circuit)
|
||||
var/list/gameodds = list(/obj/item/circuitboard/computer/arcade/battle = 33,
|
||||
/obj/item/circuitboard/computer/arcade/orion_trail = 33,
|
||||
/obj/item/circuitboard/computer/arcade/minesweeper = 33,
|
||||
var/list/gameodds = list(/obj/item/circuitboard/computer/arcade/battle = 50,
|
||||
/obj/item/circuitboard/computer/arcade/orion_trail = 50,
|
||||
/obj/item/circuitboard/computer/arcade/amputation = 2)
|
||||
var/thegame = pickweight(gameodds)
|
||||
var/obj/item/circuitboard/CB = new thegame()
|
||||
|
||||
@@ -1,413 +0,0 @@
|
||||
#define MINESWEEPER_GAME_MAIN_MENU 0
|
||||
#define MINESWEEPER_GAME_PLAYING 1
|
||||
#define MINESWEEPER_GAME_LOST 2
|
||||
#define MINESWEEPER_GAME_WON 3
|
||||
#define MINESWEEPERIMG(what) {"<img style='border:0' <span class="minesweeper16x16 [#what]"></span>"} //Basically bypassing asset.icon_tag()
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper
|
||||
name = "Minesweeper"
|
||||
desc = "An arcade machine that generates grids. It seems that the machine sparks and screeches when a grid is generated, as if it cannot cope with the intensity of generating the grid."
|
||||
icon_state = "arcade"
|
||||
circuit = /obj/item/circuitboard/computer/arcade/minesweeper
|
||||
var/area
|
||||
var/difficulty = "" //To show what difficulty you are playing
|
||||
var/flag_text = ""
|
||||
var/flagging = FALSE
|
||||
var/game_status = MINESWEEPER_GAME_MAIN_MENU
|
||||
var/mine_limit = 0
|
||||
var/mine_placed = 0
|
||||
var/mine_sound = TRUE //So it doesn't get repeated when multiple mines are exposed
|
||||
var/randomcolour = 1
|
||||
var/randomnumber = 1 //Random emagged game iteration number to be displayed, put here so it is persistent across one individual arcade machine
|
||||
var/safe_squares_revealed
|
||||
var/saved_web = "" //To display the web if you click on the arcade
|
||||
var/win_condition
|
||||
var/rows = 1
|
||||
var/columns = 1
|
||||
var/table[31][51] //Make the board boys, 30x50 board
|
||||
var/spark_spam = FALSE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/interact(mob/user)
|
||||
var/emagged = CHECK_BITFIELD(obj_flags, EMAGGED)
|
||||
var/dat
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
dat += "<head><title>Minesweeper</title></head><div align='center'><b>Minesweeper[emagged ? " <font color='red'>EXTREME EDITION</font>: Iteration <font color='[randomcolour]'>#[randomnumber]</font>" : ""]</b><br>" //Different colour mix for every random number made
|
||||
dat += "<font size='2'> [emagged ? "Explode in the game, explode in real life" : "Reveal all the squares without hitting a mine"]!<br>What difficulty do you want to play?<br><br><br><br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font>"
|
||||
else
|
||||
dat = saved_web
|
||||
user = usr
|
||||
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/minesweeper)
|
||||
assets.send(user)
|
||||
|
||||
user << browse(dat,"window=minesweeper,size=400x500")
|
||||
add_fingerprint(user)
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/reset_spark_spam()
|
||||
spark_spam = FALSE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/Topic(href, href_list)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
var/exploding_hell = FALSE //For emagged failures
|
||||
var/reset_board = FALSE
|
||||
var/mob/living/user = usr //To identify who the hell is using this window, this should also make things like aliens and monkeys able to use the machine!!
|
||||
var/web_difficulty_menu = "<font size='2'> Reveal all the squares without hitting a mine!<br>What difficulty do you want to play?<br><br><br><br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font>"
|
||||
var/web = "<head><title>Minesweeper</title></head><div align='center'><b>Minesweeper</b><br>"
|
||||
var/static_web = "<head><title>Minesweeper</title></head><div align='center'><b>Minesweeper</b><br>" //When we need to revert to the main menu we set web as this
|
||||
web = static_web
|
||||
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
web = "<head><title>Minesweeper</title></head><body><div align='center'><b>Minesweeper <font color='red'>EXTREME EDITION</font>: Iteration <font color='[randomcolour]'>#[randomnumber]</font></b><br>" //Different colour mix for every random number made
|
||||
if(!spark_spam)
|
||||
do_sparks(5, 1, src)
|
||||
spark_spam = TRUE
|
||||
addtimer(CALLBACK(src, .proc/reset_spark_spam), 30)
|
||||
|
||||
|
||||
var/startup_sound = CHECK_BITFIELD(obj_flags, EMAGGED) ? 'sound/arcade/minesweeper_emag2.ogg' : 'sound/arcade/minesweeper_startup.ogg'
|
||||
|
||||
if(href_list["Main_Menu"])
|
||||
game_status = MINESWEEPER_GAME_MAIN_MENU
|
||||
mine_limit = 0
|
||||
rows = 0
|
||||
columns = 0
|
||||
mine_placed = 0
|
||||
if(href_list["Easy"])
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
difficulty = "Easy"
|
||||
rows = 10 //9x9 board
|
||||
columns = 10
|
||||
mine_limit = 10
|
||||
if(href_list["Intermediate"])
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
difficulty = "Intermediate"
|
||||
rows = 17 //16x16 board
|
||||
columns = 17
|
||||
mine_limit = 40
|
||||
if(href_list["Hard"])
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
difficulty = "Hard"
|
||||
rows = 17 //16x30 board
|
||||
columns = 31
|
||||
mine_limit = 99
|
||||
if(href_list["Custom"])
|
||||
if(custom_generation(usr))
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
difficulty = "Custom"
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
if(href_list["Flag"])
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
if(!flagging)
|
||||
flagging = TRUE
|
||||
flag_text = "ON"
|
||||
else
|
||||
flagging = FALSE
|
||||
flag_text = "OFF"
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, FALSE, extrarange = -3)
|
||||
web += "<font size='2'>Explode in the game, explode in real life!<br>What difficulty do you want to play?<br><br><br><br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font>"
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, FALSE, extrarange = -3)
|
||||
web += web_difficulty_menu
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_PLAYING)
|
||||
mine_sound = TRUE
|
||||
|
||||
area = (rows-1)*(columns-1)
|
||||
|
||||
if(reset_board)
|
||||
mine_placed = 0
|
||||
var/reset_everything = TRUE
|
||||
make_mines(reset_everything)
|
||||
|
||||
safe_squares_revealed = 0
|
||||
win_condition = area-mine_placed
|
||||
|
||||
if(game_status != MINESWEEPER_GAME_MAIN_MENU)
|
||||
for(var/y1=1;y1<rows;y1++)
|
||||
for(var/x1=1;x1<columns;x1++)
|
||||
var/coordinates
|
||||
coordinates = (y1*100)+x1
|
||||
if(href_list["[coordinates]"])
|
||||
if(game_status == MINESWEEPER_GAME_PLAYING) //Don't do anything if we won or something
|
||||
if(!flagging)
|
||||
if(table[y1][x1] < 10 && table[y1][x1] >= 0) //Check that it's not already revealed, and stop flag removal if we're out of flag mode
|
||||
table[y1][x1] += 10
|
||||
if(table[y1][x1] != 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
else
|
||||
if(game_status != MINESWEEPER_GAME_LOST && game_status != MINESWEEPER_GAME_WON)
|
||||
game_status = MINESWEEPER_GAME_LOST
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED) && !exploding_hell)
|
||||
exploding_hell = TRUE
|
||||
explode_EVERYTHING()
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(mine_sound)
|
||||
switch(rand(1,3)) //Play every time a mine is hit
|
||||
if(1)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, FALSE, extrarange = -3)
|
||||
if(2)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, FALSE, extrarange = -3)
|
||||
if(3)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, FALSE, extrarange = -3)
|
||||
mine_sound = FALSE
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
if(table[y1][x1] >= 0) //Check that it's not already flagged
|
||||
table[y1][x1] -= 10
|
||||
else if(table[y1][x1] < 0) //If flagged, remove the flag
|
||||
table[y1][x1] += 10
|
||||
if(table[y1][x1] > 10 && !reset_board)
|
||||
safe_squares_revealed += 1
|
||||
var/y2 = y1
|
||||
var/x2 = x1
|
||||
work_squares(y2, x2) //Work squares while in this loop so there's less load
|
||||
reset_board = FALSE
|
||||
CHECK_TICK
|
||||
|
||||
web += "<table>" //Start setting up the html table
|
||||
web += "<tbody>"
|
||||
for(var/y1=1;y1<rows;y1++)
|
||||
web += "<tr>"
|
||||
for(var/x1=1;x1<columns;x1++)
|
||||
var/coordinates
|
||||
coordinates = (y1*100)+x1
|
||||
switch(table[y1][x1])
|
||||
if(-10 to -1)
|
||||
if(game_status != MINESWEEPER_GAME_PLAYING)
|
||||
web += "<td>[MINESWEEPERIMG(flag)]</td>"
|
||||
else
|
||||
web += "<td><a href='byond://?src=[REF(src)];[coordinates]=1'>[MINESWEEPERIMG(flag)]</a></td>"
|
||||
if(0)
|
||||
if(game_status != MINESWEEPER_GAME_PLAYING)
|
||||
web += "<td>[MINESWEEPERIMG(mine)]</td>"
|
||||
else
|
||||
web += "<td><a href='byond://?src=[REF(src)];[coordinates]=1'>[MINESWEEPERIMG(hidden)]</a></td>" //Make unique hrefs for every square
|
||||
if(1 to 9)
|
||||
if(game_status != MINESWEEPER_GAME_PLAYING)
|
||||
web += "<td>[MINESWEEPERIMG(hidden)]</td>"
|
||||
else
|
||||
web += "<td><a href='byond://?src=[REF(src)];[coordinates]=1'>[MINESWEEPERIMG(hidden)]</a></td>" //Make unique hrefs for every square
|
||||
if(10)
|
||||
web += "<td>[MINESWEEPERIMG(minehit)]</td>"
|
||||
if(11)
|
||||
web += "<td>[MINESWEEPERIMG(empty)]</td>"
|
||||
if(12)
|
||||
web += "<td>[MINESWEEPERIMG(1)]</td>"
|
||||
if(13)
|
||||
web += "<td>[MINESWEEPERIMG(2)]</td>"
|
||||
if(14)
|
||||
web += "<td>[MINESWEEPERIMG(3)]</td>"
|
||||
if(15)
|
||||
web += "<td>[MINESWEEPERIMG(4)]</td>"
|
||||
if(16)
|
||||
web += "<td>[MINESWEEPERIMG(5)]</td>"
|
||||
if(17)
|
||||
web += "<td>[MINESWEEPERIMG(6)]</td>"
|
||||
if(18)
|
||||
web += "<td>[MINESWEEPERIMG(7)]</td>"
|
||||
if(19)
|
||||
web += "<td>[MINESWEEPERIMG(8)]</td>"
|
||||
CHECK_TICK
|
||||
web += "</tr>"
|
||||
web += "</table>"
|
||||
web += "</tbody>"
|
||||
web += "<br>"
|
||||
|
||||
if(safe_squares_revealed >= win_condition && game_status == MINESWEEPER_GAME_PLAYING)
|
||||
game_status = MINESWEEPER_GAME_WON
|
||||
if(rows < 10 || columns < 10) //If less than easy difficulty
|
||||
playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, FALSE, extrarange = -3)
|
||||
say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!")
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, FALSE, extrarange = -3)
|
||||
say("You cleared the board of all mines! Congratulations!")
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
var/itemname
|
||||
switch(rand(1,3))
|
||||
if(1)
|
||||
itemname = "a syndicate bomb beacon"
|
||||
new /obj/item/sbeacondrop/bomb(loc)
|
||||
if(2)
|
||||
itemname = "a rocket launcher"
|
||||
new /obj/item/gun/ballistic/rocketlauncher/unrestricted(loc)
|
||||
new /obj/item/ammo_casing/caseless/rocket(loc)
|
||||
new /obj/item/ammo_casing/caseless/rocket(loc)
|
||||
new /obj/item/ammo_casing/caseless/rocket(loc)
|
||||
if(3)
|
||||
itemname = "two bags of c4"
|
||||
new /obj/item/storage/backpack/duffelbag/syndie/c4(loc)
|
||||
new /obj/item/storage/backpack/duffelbag/syndie/x4(loc)
|
||||
message_admins("[key_name_admin(user)] won emagged Minesweeper and got [itemname]!")
|
||||
visible_message("<span class='notice'>[src] dispenses [itemname]!</span>", "<span class='notice'>You hear a chime and a clunk.</span>")
|
||||
DISABLE_BITFIELD(obj_flags, EMAGGED)
|
||||
else
|
||||
var/dope_prizes = (area >= 480) ? 6 : (area >= 256) ? 4 : 2
|
||||
prizevend(user, dope_prizes)
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_WON)
|
||||
web += "[(rows < 10 || columns < 10) ? "<font size='4'>You won, but your board was too small! Pick a bigger board next time!" : "<font size='6'>Congratulations, you have won!"]<br><font size='3'>Want to play again?<br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font></a></b><br><a href='byond://?src=[REF(src)];Main_Menu=1'><font color='#cc66ff'>Return to Main Menu</font></a></b><br>"
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_LOST)
|
||||
web += "<font size='6'>You have lost!<br><font size='3'>Try again?<br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font></a></b><br><a href='byond://?src=[REF(src)];Main_Menu=1'><font color='#cc66ff'>Return to Main Menu</font></a></b><br>"
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_PLAYING)
|
||||
web += "<a href='byond://?src=[REF(src)];Main_Menu=1'><font color='#cc66ff'>Return to Main Menu</font></a><br>"
|
||||
web += "<div align='right'>Difficulty: [difficulty]<br>Mines: [mine_placed]<br>Rows: [rows-1]<br>Columns: [columns-1]<br><a href='byond://?src=[REF(src)];Flag=1'><font color='#cc66ff'>Flagging mode: [flag_text]</font></a></div>"
|
||||
|
||||
web += "</div>"
|
||||
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/minesweeper)
|
||||
saved_web = sheet.css_tag()
|
||||
saved_web += web
|
||||
updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
return
|
||||
desc = "An arcade machine that generates grids. It's clunking and sparking everywhere, almost as if threatening to explode at any moment!"
|
||||
do_sparks(5, 1, src)
|
||||
randomnumber = rand(1,255)
|
||||
randomcolour = rgb(randomnumber,randomnumber/2,randomnumber/3)
|
||||
ENABLE_BITFIELD(obj_flags, EMAGGED)
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
to_chat(user, "<span class='warning'>An ominous tune plays from the arcade's speakers!</span>")
|
||||
playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, FALSE, extrarange = 3)
|
||||
else //Can't let you do that, star fox!
|
||||
to_chat(user, "<span class='warning'>The machine buzzes and sparks... the game has been reset!</span>")
|
||||
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, FALSE, extrarange = 3) //Loud buzz
|
||||
game_status = MINESWEEPER_GAME_MAIN_MENU
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) //Entered into the menu so ping sound
|
||||
var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num
|
||||
if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
new_rows = clamp(new_rows + 1, 4, 20)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num
|
||||
if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
new_columns = clamp(new_columns + 1, 4, 30)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
var/grid_area = (new_rows - 1) * (new_columns - 1)
|
||||
var/lower_limit = round(grid_area*0.156)
|
||||
var/upper_limit = round(grid_area*0.85)
|
||||
var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num
|
||||
if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
rows = new_rows
|
||||
columns = new_columns
|
||||
mine_limit = clamp(new_mine_limit, lower_limit, upper_limit)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/make_mines(var/reset_everything)
|
||||
if(mine_placed < mine_limit)
|
||||
for(var/y1=1;y1<rows;y1++) //Board resetting and mine building
|
||||
for(var/x1=1;x1<columns;x1++)
|
||||
if(prob(area/mine_limit) && mine_placed < mine_limit && table[y1][x1] != 0) //Unlikely for this to happen but this has eaten mines before
|
||||
table[y1][x1] = 0
|
||||
mine_placed += 1
|
||||
else if(reset_everything)
|
||||
table[y1][x1] = 1
|
||||
reset_everything = FALSE
|
||||
make_mines() //In case the first pass doesn't generate enough mines
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/work_squares(var/y2, var/x2, var/y3, var/x3)
|
||||
if(y3 > 0 && x3 > 0)
|
||||
y2 = y3
|
||||
x2 = x3
|
||||
if(table[y2][x2] == 1)
|
||||
for(y3=y2-1;y3<y2+2;y3++)
|
||||
if(y3 >= rows || y3 < 1)
|
||||
continue
|
||||
for(x3=x2-1;x3<x2+2;x3++)
|
||||
if(x3 >= columns || x3 < 1)
|
||||
continue
|
||||
if(table[y3][x3] == 0)
|
||||
table[y2][x2] += 1
|
||||
if(table[y2][x2] == 11)
|
||||
for(y3=y2-1;y3<y2+2;y3++)
|
||||
if(y3 >= rows || y3 < 1)
|
||||
continue
|
||||
for(x3=x2-1;x3<x2+2;x3++)
|
||||
if(x3 >= columns || x3 < 1)
|
||||
continue
|
||||
if(table[y3][x3] > 0 && table[y3][x3] < 10)
|
||||
table[y3][x3] += 10
|
||||
work_squares(y3, x3) //Refresh so we check everything we might be missing
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/explode_EVERYTHING()
|
||||
var/mob/living/user = usr
|
||||
to_chat(user, "<span class='boldwarning'>You feel a great sense of dread wash over you, as if you just unleashed armageddon upon yourself!</span>")
|
||||
var/row_limit = rows-1
|
||||
var/column_limit = columns-1
|
||||
var/mine_limit_v2 = mine_limit
|
||||
if(rows > 21)
|
||||
row_limit = 20
|
||||
if(columns > 21)
|
||||
column_limit = 20
|
||||
if(mine_limit > (rows*columns) * 0.25)
|
||||
mine_limit_v2 = 24
|
||||
message_admins("[key_name_admin(user)] failed an emagged Minesweeper arcade and has unleashed an explosion armageddon of size [row_limit],[column_limit] around [ADMIN_LOOKUPFLW(user.loc)]!")
|
||||
if(mine_limit_v2 < 10)
|
||||
explosion(loc, 2, 5, 10, 15) //Thought you could survive by putting as few mines as possible, huh??
|
||||
else
|
||||
explosion(loc, 1, 3, rand(1,5), rand(1,10))
|
||||
var/list/targets = list()
|
||||
var/cur_y = y - round(row_limit * 0.5, 1)
|
||||
var/starting_row = 1
|
||||
if(cur_y < 1)
|
||||
starting_row -= cur_y - 1
|
||||
cur_y = 1
|
||||
var/start_x = x - round(column_limit * 0.5, 1)
|
||||
var/starting_column = 1
|
||||
if(start_x < 1)
|
||||
starting_column -= start_x - 1
|
||||
start_x = 1
|
||||
for(var/row in starting_row to length(table)) //translate the mines locations into actual turf coordinates.
|
||||
if(!locate(cur_y, start_x, z))
|
||||
break
|
||||
var/cur_x = start_x
|
||||
for(var/column in starting_column to length(table[row]))
|
||||
var/coord_value = table[row][column]
|
||||
if(coord_value == 10 || coord_value == 0) //there is a mine in here.
|
||||
var/turf/T = locate(cur_y, cur_x, z)
|
||||
if(!T)
|
||||
break
|
||||
targets += T
|
||||
cur_x++
|
||||
cur_y++
|
||||
var/num_explosions = 0
|
||||
for(var/T in shuffle(targets)) //Create a shitton of explosions in irl turfs if we lose, it will probably kill us
|
||||
addtimer(CALLBACK(GLOBAL_PROC, /proc/explosion, T, 0, rand(1,2),rand(1,5),rand(3,10), FALSE), 15 * ++num_explosions)
|
||||
if(num_explosions == mine_limit_v2)
|
||||
return
|
||||
|
||||
#undef MINESWEEPERIMG
|
||||
#undef MINESWEEPER_GAME_MAIN_MENU
|
||||
#undef MINESWEEPER_GAME_PLAYING
|
||||
#undef MINESWEEPER_GAME_LOST
|
||||
#undef MINESWEEPER_GAME_WON
|
||||
@@ -62,7 +62,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/requests_console/update_icon_state()
|
||||
if(CHECK_BITFIELD(stat, NOPOWER))
|
||||
if((stat & NOPOWER))
|
||||
set_light(0)
|
||||
else
|
||||
set_light(1.4, 0.7, "#34D352")//green light
|
||||
@@ -72,7 +72,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
|
||||
icon_state="req_comp_open"
|
||||
else
|
||||
icon_state="req_comp_rewired"
|
||||
else if(CHECK_BITFIELD(stat, NOPOWER))
|
||||
else if((stat & NOPOWER))
|
||||
if(icon_state != "req_comp_off")
|
||||
icon_state = "req_comp_off"
|
||||
else
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
The log console for viewing the entire telecomms
|
||||
The log console for viewing the entire telecomms
|
||||
network log
|
||||
*/
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
var/network = "NULL" // the network to probe
|
||||
var/notice = ""
|
||||
var/universal_translate = FALSE // set to TRUE(1) if it can translate nonhuman speech
|
||||
var/universal_translate = FALSE // set to TRUE(1) if it can translate nonhuman speech
|
||||
|
||||
/obj/machinery/computer/telecomms/server/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
if(!LAZYLEN(SelectedMachine.log_entries))
|
||||
return data_out
|
||||
|
||||
|
||||
for(var/datum/comm_log_entry/C in SelectedMachine.log_entries)
|
||||
var/list/data = list()
|
||||
data["name"] = C.name //name of the file
|
||||
@@ -104,7 +104,7 @@
|
||||
data["message"] = C.parameters["message"]
|
||||
else
|
||||
data["message"] = "(unintelligible)"
|
||||
|
||||
|
||||
data_out["selected_logs"] += list(data)
|
||||
return data_out
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
if(LAZYLEN(machinelist) > 0)
|
||||
notice = "FAILED: Cannot probe when buffer full"
|
||||
return
|
||||
|
||||
|
||||
for(var/obj/machinery/telecomms/T in GLOB.telecomms_list) //telecomms just went global!
|
||||
if(T.network == network)
|
||||
LAZYADD(machinelist, T)
|
||||
@@ -147,7 +147,7 @@
|
||||
SelectedMachine = T
|
||||
break
|
||||
if("delete")
|
||||
if(!src.allowed(usr) && !CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
if(!src.allowed(usr) && !(obj_flags & EMAGGED))
|
||||
to_chat(usr, "<span class='danger'>ACCESS DENIED.</span>")
|
||||
return
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
return
|
||||
var/datum/comm_log_entry/D = locate(params["value"])
|
||||
if(!istype(D))
|
||||
notice = "NOTICE: Object not found"
|
||||
notice = "NOTICE: Object not found"
|
||||
return
|
||||
notice = "Deleted entry: [D.name]"
|
||||
LAZYREMOVE(SelectedMachine.log_entries, D)
|
||||
|
||||
@@ -94,9 +94,9 @@
|
||||
if(istype(S) && S.hack_software)
|
||||
data_out["canhack"] = TRUE
|
||||
|
||||
data_out["hacking"] = (hacking || CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
data_out["hacking"] = (hacking || (obj_flags & EMAGGED))
|
||||
if(hacking)
|
||||
data_out["borg"] = ((isAI(user) || iscyborg(user)) && !CHECK_BITFIELD(obj_flags, EMAGGED)) //even borgs can't read emag
|
||||
data_out["borg"] = ((isAI(user) || iscyborg(user)) && !(obj_flags & EMAGGED)) //even borgs can't read emag
|
||||
return data_out
|
||||
|
||||
data_out["servers"] = list()
|
||||
@@ -324,7 +324,7 @@
|
||||
update_static_data(usr)
|
||||
|
||||
/obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params)
|
||||
if(O.tool_behaviour == TOOL_SCREWDRIVER && CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
if(O.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED))
|
||||
//Stops people from just unscrewing the monitor and putting it back to get the console working again.
|
||||
//Why this though, you should make it emag to a board level. (i wont do it)
|
||||
to_chat(user, "<span class='warning'>It is too hot to mess with!</span>")
|
||||
@@ -333,12 +333,12 @@
|
||||
|
||||
/obj/machinery/computer/message_monitor/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
if((obj_flags & EMAGGED))
|
||||
return
|
||||
if(isnull(linkedServer))
|
||||
to_chat(user, "<span class='notice'>A no server error appears on the screen.</span>")
|
||||
return
|
||||
ENABLE_BITFIELD(obj_flags, EMAGGED)
|
||||
obj_flags |= EMAGGED
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.start()
|
||||
var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
|
||||
@@ -366,7 +366,7 @@
|
||||
message = ""
|
||||
|
||||
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
|
||||
DISABLE_BITFIELD(obj_flags, EMAGGED)
|
||||
obj_flags &= ~(EMAGGED)
|
||||
message = ""
|
||||
|
||||
/obj/machinery/computer/message_monitor/proc/ResetMessage()
|
||||
|
||||
@@ -119,7 +119,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
|
||||
/obj/machinery/telecomms/proc/update_power()
|
||||
if(toggled)
|
||||
// if powered, on. if not powered, off. if too damaged, off
|
||||
if(CHECK_BITFIELD(stat, (BROKEN | NOPOWER | EMPED)))
|
||||
if(stat &(BROKEN | NOPOWER | EMPED))
|
||||
on = FALSE
|
||||
else
|
||||
on = TRUE
|
||||
@@ -137,11 +137,11 @@ GLOBAL_LIST_EMPTY(telecomms_list)
|
||||
|
||||
/obj/machinery/telecomms/emp_act(severity)
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(., EMP_PROTECT_SELF))
|
||||
if((. & EMP_PROTECT_SELF))
|
||||
return
|
||||
if(prob(severity))
|
||||
if(!CHECK_BITFIELD(stat, EMPED))
|
||||
ENABLE_BITFIELD(stat, EMPED)
|
||||
if(!(stat & EMPED))
|
||||
stat |= EMPED
|
||||
var/duration = severity * 35
|
||||
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
|
||||
DISABLE_BITFIELD(stat, EMPED)
|
||||
stat &= ~(EMPED)
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail()
|
||||
..()
|
||||
if(reagents)
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags &= ~(NO_REACT)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M)
|
||||
if(..())
|
||||
|
||||
@@ -450,8 +450,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
A.Remove(user)
|
||||
if(item_flags & DROPDEL)
|
||||
qdel(src)
|
||||
DISABLE_BITFIELD(item_flags, IN_INVENTORY)
|
||||
DISABLE_BITFIELD(item_flags, IN_STORAGE)
|
||||
item_flags &= ~(IN_INVENTORY)
|
||||
item_flags &= ~(IN_STORAGE)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
|
||||
remove_outline()
|
||||
// if(!silent)
|
||||
@@ -529,8 +529,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
|
||||
A.Grant(user)
|
||||
item_flags |= IN_INVENTORY
|
||||
if(CHECK_BITFIELD(item_flags, IN_STORAGE)) // Left storage item but somehow has the bitfield active still.
|
||||
DISABLE_BITFIELD(item_flags, IN_STORAGE)
|
||||
if((item_flags & IN_STORAGE)) // Left storage item but somehow has the bitfield active still.
|
||||
item_flags &= ~(IN_STORAGE)
|
||||
// if(!initial)
|
||||
// if(equip_sound && (slot_flags & slot))
|
||||
// playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE)
|
||||
@@ -1054,7 +1054,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
*/
|
||||
/obj/item/proc/set_slowdown(new_slowdown)
|
||||
slowdown = new_slowdown
|
||||
if(CHECK_BITFIELD(item_flags, IN_INVENTORY))
|
||||
if((item_flags & IN_INVENTORY))
|
||||
var/mob/living/L = loc
|
||||
if(istype(L))
|
||||
L.update_equipment_speed_mods()
|
||||
|
||||
@@ -190,7 +190,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
qdel(src)
|
||||
return
|
||||
// allowing reagents to react after being lit
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags &= ~(NO_REACT)
|
||||
reagents.handle_reactions()
|
||||
icon_state = icon_on
|
||||
item_state = icon_on
|
||||
@@ -762,7 +762,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if(!screw)
|
||||
screw = TRUE
|
||||
to_chat(user, "<span class='notice'>You open the cap on [src].</span>")
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
if(obj_flags & EMAGGED)
|
||||
add_overlay("vapeopen_high")
|
||||
else if(super)
|
||||
@@ -772,7 +772,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
else
|
||||
screw = FALSE
|
||||
to_chat(user, "<span class='notice'>You close the cap on [src].</span>")
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags &= ~(OPENCONTAINER)
|
||||
cut_overlays()
|
||||
|
||||
if(O.tool_behaviour == TOOL_MULTITOOL)
|
||||
@@ -822,7 +822,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if(slot == SLOT_WEAR_MASK)
|
||||
if(!screw)
|
||||
to_chat(user, "<span class='notice'>You start puffing on the vape.</span>")
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags &= ~(NO_REACT)
|
||||
START_PROCESSING(SSobj, src)
|
||||
else //it will not start if the vape is opened.
|
||||
to_chat(user, "<span class='warning'>You need to close the cap first!</span>")
|
||||
@@ -831,7 +831,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
. = ..()
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.get_item_by_slot(SLOT_WEAR_MASK) == src)
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags |= NO_REACT
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/clothing/mask/vape/proc/hand_reagents()//had to rename to avoid duplicate error
|
||||
|
||||
@@ -259,11 +259,6 @@
|
||||
|
||||
build_path = /obj/machinery/computer/arcade/orion_trail
|
||||
|
||||
/obj/item/circuitboard/computer/arcade/minesweeper
|
||||
name = "Minesweeper (Computer Board)"
|
||||
icon_state = "generic"
|
||||
build_path = /obj/machinery/computer/arcade/minesweeper
|
||||
|
||||
/obj/item/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future
|
||||
name = "Holodeck Control (Computer Board)"
|
||||
icon_state = "generic"
|
||||
|
||||
@@ -1295,6 +1295,15 @@
|
||||
/obj/item/stock_parts/manipulator = 1)
|
||||
needs_anchored = FALSE
|
||||
|
||||
/obj/item/circuitboard/machine/autoloom
|
||||
name = "Autoloom (Machine Board)"
|
||||
icon_state = "service"
|
||||
build_path = /obj/machinery/autoloom
|
||||
req_components = list(
|
||||
/obj/item/stock_parts/matter_bin = 1,
|
||||
/obj/item/stock_parts/manipulator = 1)
|
||||
needs_anchored = FALSE
|
||||
|
||||
/obj/item/circuitboard/machine/seed_extractor
|
||||
name = "Seed Extractor (Machine Board)"
|
||||
icon_state = "service"
|
||||
|
||||
@@ -72,6 +72,10 @@
|
||||
var/datum/team/gang/gang //For marking territory.
|
||||
var/gang_tag_delay = 30 //this is the delay for gang mode tag applications on anything that gang = true on.
|
||||
|
||||
var/precision_mode = FALSE
|
||||
var/precision_x = 0
|
||||
var/precision_y = 0
|
||||
|
||||
/obj/item/toy/crayon/proc/isValidSurface(surface)
|
||||
return istype(surface, /turf/open/floor)
|
||||
|
||||
@@ -228,6 +232,12 @@
|
||||
.["can_change_colour"] = can_change_colour
|
||||
.["current_colour"] = paint_color
|
||||
|
||||
.["precision_mode"] = precision_mode
|
||||
.["x"] = precision_x
|
||||
.["y"] = precision_y
|
||||
.["min_offset"] = -world.icon_size/2
|
||||
.["max_offset"] = world.icon_size/2
|
||||
|
||||
/obj/item/toy/crayon/ui_act(action, list/params)
|
||||
if(..())
|
||||
return
|
||||
@@ -256,6 +266,17 @@
|
||||
. = TRUE
|
||||
paint_mode = PAINT_NORMAL
|
||||
drawtype = "a"
|
||||
if("toggle_precision")
|
||||
precision_mode = !precision_mode
|
||||
. = TRUE
|
||||
if("set_precision_x")
|
||||
var/x = text2num(params["x"])
|
||||
precision_x = x
|
||||
. = TRUE
|
||||
if("set_precision_y")
|
||||
var/y = text2num(params["y"])
|
||||
precision_y = y
|
||||
. = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/crayon/proc/select_colour(mob/user)
|
||||
@@ -400,8 +421,12 @@
|
||||
if(PAINT_NORMAL)
|
||||
var/obj/effect/decal/cleanable/crayon/C = new(target, paint_color, drawing, temp, graf_rot)
|
||||
C.add_hiddenprint(user)
|
||||
C.pixel_x = clickx
|
||||
C.pixel_y = clicky
|
||||
if(precision_mode)
|
||||
C.pixel_x = clamp(precision_x, -(world.icon_size/2), world.icon_size/2)
|
||||
C.pixel_y = clamp(precision_y, -(world.icon_size/2), world.icon_size/2)
|
||||
else
|
||||
C.pixel_x = clickx
|
||||
C.pixel_y = clicky
|
||||
affected_turfs += target
|
||||
if(PAINT_LARGE_HORIZONTAL)
|
||||
var/turf/left = locate(target.x-1,target.y,target.z)
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
cleaning_cycles--
|
||||
cleaning = TRUE
|
||||
for(var/mob/living/carbon/C in (touchable_items))
|
||||
if((C.status_flags & GODMODE) || !CHECK_BITFIELD(C.vore_flags, DIGESTABLE))
|
||||
if((C.status_flags & GODMODE) || !(C.vore_flags & DIGESTABLE))
|
||||
items_preserved += C
|
||||
else
|
||||
C.adjustBruteLoss(2)
|
||||
@@ -335,7 +335,7 @@
|
||||
var/atom/target = pick(touchable_items)
|
||||
if(iscarbon(target)) //Handle the target being a mob
|
||||
var/mob/living/carbon/T = target
|
||||
if(T.stat == DEAD && CHECK_BITFIELD(T.vore_flags, DIGESTABLE)) //Mob is now dead
|
||||
if(T.stat == DEAD && (T.vore_flags & DIGESTABLE)) //Mob is now dead
|
||||
message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[hound.x];Y=[hound.y];Z=[hound.z]'>JMP</a>" : "null"])")
|
||||
to_chat(hound,"<span class='notice'>You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.</span>")
|
||||
to_chat(T,"<span class='notice'>You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.</span>")
|
||||
@@ -433,7 +433,7 @@
|
||||
var/mob/living/silicon/robot/hound = get_host()
|
||||
if(!hound || !istype(target) || !proximity || target.anchored)
|
||||
return
|
||||
if (!CHECK_BITFIELD(target.vore_flags,DEVOURABLE))
|
||||
if (!(target.vore_flags & DEVOURABLE))
|
||||
to_chat(user, "The target registers an error code. Unable to insert into [src].")
|
||||
return
|
||||
if(patient)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
|
||||
resistance_flags = FIRE_PROOF
|
||||
wound_bonus = -110
|
||||
wound_bonus = -40
|
||||
bare_wound_bonus = 20
|
||||
block_parry_data = /datum/block_parry_data/dual_esword
|
||||
block_chance = 60
|
||||
@@ -133,7 +133,7 @@
|
||||
total_mass = initial(total_mass)
|
||||
wielded = FALSE
|
||||
hitsound = "swing_hit"
|
||||
slowdown_wielded -= slowdown_wielded
|
||||
slowdown -= slowdown_wielded
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
set_light(0)
|
||||
RemoveElement(/datum/element/sword_point)
|
||||
@@ -278,6 +278,7 @@
|
||||
desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
|
||||
force = 7
|
||||
hitsound_on = 'sound/weapons/nebhit.ogg'
|
||||
wound_bonus = -20
|
||||
armour_penetration = 60
|
||||
light_color = "#37FFF7"
|
||||
rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
|
||||
|
||||
@@ -174,11 +174,11 @@
|
||||
/obj/item/shield/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
||||
if(ismovable(object))
|
||||
var/atom/movable/AM = object
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_TRANSPARENT) && (AM.pass_flags & PASSGLASS))
|
||||
if((shield_flags & SHIELD_TRANSPARENT) && (AM.pass_flags & PASSGLASS))
|
||||
return BLOCK_NONE
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_NO_RANGED) && (attack_type & ATTACK_TYPE_PROJECTILE))
|
||||
if((shield_flags & SHIELD_NO_RANGED) && (attack_type & ATTACK_TYPE_PROJECTILE))
|
||||
return BLOCK_NONE
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_NO_MELEE) && (attack_type & ATTACK_TYPE_MELEE))
|
||||
if((shield_flags & SHIELD_NO_MELEE) && (attack_type & ATTACK_TYPE_MELEE))
|
||||
return BLOCK_NONE
|
||||
if(attack_type & ATTACK_TYPE_THROWN)
|
||||
final_block_chance += 30
|
||||
@@ -249,15 +249,15 @@
|
||||
if(attack_type & ATTACK_TYPE_MELEE)
|
||||
var/obj/hittingthing = object
|
||||
if(hittingthing.damtype == BURN)
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_WEAK))
|
||||
if((shield_flags & SHIELD_ENERGY_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_STRONG))
|
||||
else if((shield_flags & SHIELD_ENERGY_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == BRUTE)
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_WEAK))
|
||||
if((shield_flags & SHIELD_KINETIC_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_STRONG))
|
||||
else if((shield_flags & SHIELD_KINETIC_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == STAMINA || hittingthing.damtype == TOX || hittingthing.damtype == CLONE || hittingthing.damtype == BRAIN || hittingthing.damtype == OXY)
|
||||
@@ -266,19 +266,19 @@
|
||||
if(attack_type & ATTACK_TYPE_PROJECTILE)
|
||||
var/obj/item/projectile/shootingthing = object
|
||||
if(is_energy_reflectable_projectile(shootingthing))
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_WEAK))
|
||||
if((shield_flags & SHIELD_ENERGY_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_STRONG))
|
||||
else if((shield_flags & SHIELD_ENERGY_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(!is_energy_reflectable_projectile(object))
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_WEAK))
|
||||
if((shield_flags & SHIELD_KINETIC_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_STRONG))
|
||||
else if((shield_flags & SHIELD_KINETIC_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(shootingthing.damage_type == STAMINA)
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_DISABLER_DISRUPTED))
|
||||
if((shield_flags & SHIELD_DISABLER_DISRUPTED))
|
||||
final_damage *= 3 //disablers melt these kinds of shields. Really meant more for holoshields.
|
||||
else
|
||||
final_damage = 0
|
||||
|
||||
@@ -1290,9 +1290,9 @@
|
||||
var/toxic_risk = min(round(spess_current_year - expiration_date * 0.01), 1)
|
||||
for(var/obj/item/reagent_containers/food/snacks/S in contents)
|
||||
if(prob(gross_risk))
|
||||
ENABLE_BITFIELD(S.foodtype, GROSS)
|
||||
S.foodtype |= GROSS
|
||||
if(prob(toxic_risk))
|
||||
ENABLE_BITFIELD(S.foodtype, TOXIC)
|
||||
S.foodtype |= TOXIC
|
||||
|
||||
/obj/item/storage/box/mre/menu1
|
||||
name = "\improper Nanotrasen MRE Ration Kit Menu 1"
|
||||
|
||||
@@ -370,7 +370,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
|
||||
desc = replacetext(desc, "Danger", "Bouncy")
|
||||
desc = replacetext(desc, "robust", "safe")
|
||||
desc = replacetext(desc, "heavier", "bouncier")
|
||||
DISABLE_BITFIELD(flags_1, CONDUCT_1)
|
||||
flags_1 &= ~(CONDUCT_1)
|
||||
custom_materials = null
|
||||
damtype = STAMINA
|
||||
force += 3 //to compensate the higher stamina K.O. threshold compared to actual health.
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
var/obj/item/clothing/mask/M = check
|
||||
if(M.mask_adjusted)
|
||||
M.adjustmask(H)
|
||||
if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
|
||||
if((check.clothing_flags & ALLOWINTERNALS))
|
||||
internals = TRUE
|
||||
|
||||
if(!internals)
|
||||
|
||||
@@ -291,10 +291,10 @@
|
||||
status = !status
|
||||
if(status)
|
||||
to_chat(user, "<span class='notice'>You resecure [src] and close the fuel tank.</span>")
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags &= ~(OPENCONTAINER)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] can now be attached, modified, and refuelled.</span>")
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
desc = "A wondrous decorated Christmas tree."
|
||||
icon_state = "pine_c"
|
||||
icon_states = null
|
||||
resistance_flags = INDESTRUCTIBLE //Sorry grinch, not this time
|
||||
|
||||
/obj/structure/flora/tree/pine/xmas/presents
|
||||
icon_state = "pinepresents"
|
||||
|
||||
@@ -800,6 +800,13 @@
|
||||
|
||||
/datum/outfit/ghostcafe/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if (isplasmaman(H))
|
||||
head = /obj/item/clothing/head/helmet/space/plasmaman
|
||||
uniform = /obj/item/clothing/under/plasmaman
|
||||
l_hand= /obj/item/tank/internals/plasmaman/belt/full
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
return
|
||||
|
||||
var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT
|
||||
if (CONFIG_GET(flag/grey_assistants))
|
||||
uniform = suited ? /obj/item/clothing/under/color/grey : /obj/item/clothing/under/color/jumpskirt/grey
|
||||
@@ -809,6 +816,10 @@
|
||||
else
|
||||
uniform = suited ? /obj/item/clothing/under/color/random : /obj/item/clothing/under/color/jumpskirt/random
|
||||
|
||||
/datum/outfit/ghostcafe/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
H.internal = H.get_item_for_held_index(1)
|
||||
H.update_internals_hud_icon(1)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chameleon/ghostcafe
|
||||
name = "ghost cafe costuming kit"
|
||||
desc = "Look just the way you did in life - or better!"
|
||||
|
||||
@@ -247,7 +247,13 @@ GLOBAL_LIST_EMPTY(crematoriums)
|
||||
|
||||
locked = TRUE
|
||||
update_icon()
|
||||
|
||||
for(var/mob/living/simple_animal/jacq/J in conts)
|
||||
visible_message("<b>[src]</b> cackles, <span class='spooky'>\"You'll nae get rid a me that easily!\"</span>")
|
||||
playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25)
|
||||
J.poof()
|
||||
locked = FALSE
|
||||
update_icon()
|
||||
return
|
||||
for(var/mob/living/M in conts)
|
||||
if (M.stat != DEAD)
|
||||
M.emote("scream")
|
||||
|
||||
@@ -512,7 +512,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
|
||||
/turf/shove_act(mob/living/target, mob/living/user, pre_act = FALSE)
|
||||
var/list/possibilities
|
||||
for(var/obj/O in contents)
|
||||
if(CHECK_BITFIELD(O.obj_flags, SHOVABLE_ONTO))
|
||||
if((O.obj_flags & SHOVABLE_ONTO))
|
||||
LAZYADD(possibilities, O)
|
||||
else if(!O.CanPass(target, src))
|
||||
return FALSE
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
selectors_used |= query.where_switched
|
||||
combined_refs |= query.select_refs
|
||||
running -= query
|
||||
if(!CHECK_BITFIELD(query.options, SDQL2_OPTION_DO_NOT_AUTOGC))
|
||||
if(!(query.options & SDQL2_OPTION_DO_NOT_AUTOGC))
|
||||
QDEL_IN(query, 50)
|
||||
else
|
||||
if(usr)
|
||||
@@ -442,19 +442,19 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
|
||||
if("select")
|
||||
switch(value)
|
||||
if("force_nulls")
|
||||
DISABLE_BITFIELD(options, SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS)
|
||||
options &= ~(SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS)
|
||||
if("proccall")
|
||||
switch(value)
|
||||
if("blocking")
|
||||
ENABLE_BITFIELD(options, SDQL2_OPTION_BLOCKING_CALLS)
|
||||
options |= SDQL2_OPTION_BLOCKING_CALLS
|
||||
if("priority")
|
||||
switch(value)
|
||||
if("high")
|
||||
ENABLE_BITFIELD(options, SDQL2_OPTION_HIGH_PRIORITY)
|
||||
options |= SDQL2_OPTION_HIGH_PRIORITY
|
||||
if("autogc")
|
||||
switch(value)
|
||||
if("keep_alive")
|
||||
ENABLE_BITFIELD(options, SDQL2_OPTION_DO_NOT_AUTOGC)
|
||||
options |= SDQL2_OPTION_DO_NOT_AUTOGC
|
||||
|
||||
/datum/SDQL2_query/proc/ARun()
|
||||
INVOKE_ASYNC(src, .proc/Run)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/datum/game_mode/dynamic/mode
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
mode = SSticker.mode
|
||||
assassin_prob = max(0,mode.threat_level-40)
|
||||
assassin_prob = max(0,mode.threat_level-20)
|
||||
if(prob(assassin_prob))
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = T.owner
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
return genit_list
|
||||
|
||||
/obj/item/organ/genital/proc/climaxable(mob/living/carbon/human/H, silent = FALSE) //returns the fluid source (ergo reagents holder) if found.
|
||||
if(CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION))
|
||||
if((genital_flags & GENITAL_FUID_PRODUCTION))
|
||||
. = reagents
|
||||
else
|
||||
if(linked_organ)
|
||||
@@ -124,7 +124,7 @@
|
||||
var/list/worn_stuff = get_equipped_items()
|
||||
|
||||
for(var/obj/item/organ/genital/G in internal_organs)
|
||||
if(CHECK_BITFIELD(G.genital_flags, CAN_CLIMAX_WITH) && G.is_exposed(worn_stuff)) //filter out what you can't masturbate with
|
||||
if((G.genital_flags & CAN_CLIMAX_WITH) && G.is_exposed(worn_stuff)) //filter out what you can't masturbate with
|
||||
LAZYADD(genitals_list, G)
|
||||
if(LAZYLEN(genitals_list))
|
||||
var/obj/item/organ/genital/ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list
|
||||
@@ -212,7 +212,7 @@
|
||||
if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
|
||||
log_message("was forced to climax by [cause]",LOG_EMOTE)
|
||||
for(var/obj/item/organ/genital/G in internal_organs)
|
||||
if(!CHECK_BITFIELD(G.genital_flags, CAN_CLIMAX_WITH)) //Skip things like wombs and testicles
|
||||
if(!(G.genital_flags & CAN_CLIMAX_WITH)) //Skip things like wombs and testicles
|
||||
continue
|
||||
mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms
|
||||
//Now all genitals that could climax, have.
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
|
||||
var/list/genital_list = list()
|
||||
for(var/obj/item/organ/genital/G in internal_organs)
|
||||
if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL))
|
||||
if(!(G.genital_flags & GENITAL_INTERNAL))
|
||||
genital_list += G
|
||||
if(!genital_list.len) //There is nothing to expose
|
||||
return
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
else
|
||||
desc += " You estimate that they're [uppertext(size)]-cups."
|
||||
|
||||
if(CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION) && aroused_state)
|
||||
if((genital_flags & GENITAL_FUID_PRODUCTION) && aroused_state)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[fluid_id]
|
||||
if(R)
|
||||
desc += " They're leaking [lowertext(R.name)]."
|
||||
@@ -115,7 +115,7 @@
|
||||
size = D.features["breasts_size"]
|
||||
shape = D.features["breasts_shape"]
|
||||
if(!D.features["breasts_producing"])
|
||||
DISABLE_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH)
|
||||
genital_flags &= ~ (GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH)
|
||||
if(!isnum(size))
|
||||
cached_size = breast_values[size]
|
||||
else
|
||||
|
||||
@@ -273,24 +273,6 @@
|
||||
"frenching" = 'icons/UI_Icons/Achievements/Misc/frenchingthebubble.png'
|
||||
)
|
||||
|
||||
/datum/asset/spritesheet/simple/minesweeper
|
||||
name = "minesweeper"
|
||||
assets = list(
|
||||
"1" = 'icons/UI_Icons/minesweeper_tiles/one.png',
|
||||
"2" = 'icons/UI_Icons/minesweeper_tiles/two.png',
|
||||
"3" = 'icons/UI_Icons/minesweeper_tiles/three.png',
|
||||
"4" = 'icons/UI_Icons/minesweeper_tiles/four.png',
|
||||
"5" = 'icons/UI_Icons/minesweeper_tiles/five.png',
|
||||
"6" = 'icons/UI_Icons/minesweeper_tiles/six.png',
|
||||
"7" = 'icons/UI_Icons/minesweeper_tiles/seven.png',
|
||||
"8" = 'icons/UI_Icons/minesweeper_tiles/eight.png',
|
||||
"empty" = 'icons/UI_Icons/minesweeper_tiles/empty.png',
|
||||
"flag" = 'icons/UI_Icons/minesweeper_tiles/flag.png',
|
||||
"hidden" = 'icons/UI_Icons/minesweeper_tiles/hidden.png',
|
||||
"mine" = 'icons/UI_Icons/minesweeper_tiles/mine.png',
|
||||
"minehit" = 'icons/UI_Icons/minesweeper_tiles/minehit.png'
|
||||
)
|
||||
|
||||
/datum/asset/spritesheet/simple/pills
|
||||
name = "pills"
|
||||
assets = list(
|
||||
|
||||
@@ -171,11 +171,11 @@
|
||||
desc = "Start up your own grand casino with this crate filled with slot machine and arcade boards!"
|
||||
cost = 3000
|
||||
contains = list(/obj/item/circuitboard/computer/arcade/battle,
|
||||
/obj/item/circuitboard/computer/arcade/battle,
|
||||
/obj/item/circuitboard/computer/arcade/battle,
|
||||
/obj/item/circuitboard/computer/arcade/orion_trail,
|
||||
/obj/item/circuitboard/computer/arcade/orion_trail,
|
||||
/obj/item/circuitboard/computer/arcade/minesweeper,
|
||||
/obj/item/circuitboard/computer/arcade/minesweeper,
|
||||
/obj/item/circuitboard/computer/arcade/orion_trail,
|
||||
/obj/item/circuitboard/computer/slot_machine,
|
||||
/obj/item/circuitboard/computer/slot_machine,
|
||||
/obj/item/circuitboard/computer/slot_machine,
|
||||
|
||||
@@ -126,29 +126,29 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
var/list/json_from_file = json_decode(file2text(vr_path))
|
||||
if(json_from_file)
|
||||
if(json_from_file["digestable"])
|
||||
ENABLE_BITFIELD(vore_flags,DIGESTABLE)
|
||||
vore_flags |= DIGESTABLE
|
||||
if(json_from_file["devourable"])
|
||||
ENABLE_BITFIELD(vore_flags,DEVOURABLE)
|
||||
vore_flags |= DEVOURABLE
|
||||
if(json_from_file["feeding"])
|
||||
ENABLE_BITFIELD(vore_flags,FEEDING)
|
||||
vore_flags |= FEEDING
|
||||
if(json_from_file["lickable"])
|
||||
ENABLE_BITFIELD(vore_flags,LICKABLE)
|
||||
vore_flags |= LICKABLE
|
||||
belly_prefs = json_from_file["belly_prefs"]
|
||||
vore_taste = json_from_file["vore_taste"]
|
||||
|
||||
for(var/V in all_quirks) // quirk migration
|
||||
switch(V)
|
||||
if("Acute hepatic pharmacokinesis")
|
||||
DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
|
||||
DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
|
||||
ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
|
||||
ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
|
||||
cit_toggles &= ~(PENIS_ENLARGEMENT)
|
||||
cit_toggles &= ~(BREAST_ENLARGEMENT)
|
||||
cit_toggles |= FORCED_FEM
|
||||
cit_toggles |= FORCED_MASC
|
||||
all_quirks -= V
|
||||
if("Crocin Immunity")
|
||||
ENABLE_BITFIELD(cit_toggles,NO_APHRO)
|
||||
cit_toggles |= NO_APHRO
|
||||
all_quirks -= V
|
||||
if("Buns of Steel")
|
||||
ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
|
||||
cit_toggles |= NO_ASS_SLAP
|
||||
all_quirks -= V
|
||||
|
||||
if(features["meat_type"] == "Inesct")
|
||||
@@ -178,13 +178,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feeding"] >> feeding
|
||||
S["lickable"] >> lickable
|
||||
if(digestable)
|
||||
ENABLE_BITFIELD(vore_flags,DIGESTABLE)
|
||||
vore_flags |= DIGESTABLE
|
||||
if(devourable)
|
||||
ENABLE_BITFIELD(vore_flags,DEVOURABLE)
|
||||
vore_flags |= DEVOURABLE
|
||||
if(feeding)
|
||||
ENABLE_BITFIELD(vore_flags,FEEDING)
|
||||
vore_flags |= FEEDING
|
||||
if(lickable)
|
||||
ENABLE_BITFIELD(vore_flags,LICKABLE)
|
||||
vore_flags |= LICKABLE
|
||||
|
||||
if(current_version < 30)
|
||||
switch(features["taur"])
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
/obj/item/clothing/Initialize()
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
if((clothing_flags & VOICEBOX_TOGGLABLE))
|
||||
actions_types += /datum/action/item_action/toggle_voice_box
|
||||
if(ispath(pocket_storage_component_path))
|
||||
LoadComponent(pocket_storage_component_path)
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this to a secbot
|
||||
|
||||
/obj/item/clothing/mask/attack_self(mob/user)
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
TOGGLE_BITFIELD(clothing_flags, VOICEBOX_DISABLED)
|
||||
var/status = !CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)
|
||||
if((clothing_flags & VOICEBOX_TOGGLABLE))
|
||||
(clothing_flags ^= VOICEBOX_DISABLED)
|
||||
var/status = !(clothing_flags & VOICEBOX_DISABLED)
|
||||
to_chat(user, "<span class='notice'>You turn the voice box in [src] [status ? "on" : "off"].</span>")
|
||||
|
||||
/obj/item/clothing/mask/equipped(mob/M, slot)
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/pig/handle_speech(datum/source, list/speech_args)
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
if(!(clothing_flags & VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("Oink!","Squeeeeeeee!","Oink Oink!")
|
||||
|
||||
/obj/item/clothing/mask/pig/cursed //needs to be different otherwise you could turn the speedmodification off and on
|
||||
@@ -150,7 +150,7 @@
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
if(!(clothing_flags & VOICEBOX_DISABLED))
|
||||
if(prob(5)) //sometimes, the angry spirit finds others words to speak.
|
||||
speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!")
|
||||
else
|
||||
@@ -180,7 +180,7 @@
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/cowmask/handle_speech(datum/source, list/speech_args)
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
if(!(clothing_flags & VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!")
|
||||
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
clothing_flags = VOICEBOX_TOGGLABLE
|
||||
|
||||
/obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args)
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
if(!(clothing_flags & VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
|
||||
|
||||
|
||||
@@ -500,7 +500,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/attack_self(mob/user)
|
||||
if(!is_drainable())
|
||||
to_chat(user, "You pull back the tab of \the [src] with a satisfying pop.") //Ahhhhhhhh
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
playsound(src, "can_open", 50, 1)
|
||||
spillable = TRUE
|
||||
return
|
||||
|
||||
@@ -8,14 +8,9 @@
|
||||
anchored = TRUE
|
||||
var/items_list = list()
|
||||
speech_span = "spooky"
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
var/active = TRUE
|
||||
|
||||
/obj/item/barthpot/Destroy()
|
||||
var/obj/item/barthpot/n = new src(loc)
|
||||
n.items_list = items_list
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/barthpot/attackby(obj/item/I, mob/user, params)
|
||||
if(!active)
|
||||
say("Meow!")
|
||||
|
||||
@@ -65,6 +65,10 @@
|
||||
cached_z = z
|
||||
poof()
|
||||
|
||||
/mob/living/simple_animal/jacq/ComponentInitialize() //she just wants to bring halloween to the station
|
||||
. = ..()
|
||||
AddComponent(/datum/component/stationloving)
|
||||
|
||||
/mob/living/simple_animal/jacq/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
@@ -469,9 +473,9 @@
|
||||
/mob/living/simple_animal/jacq/update_mobility()
|
||||
. = ..()
|
||||
if(busy)
|
||||
DISABLE_BITFIELD(., MOBILITY_MOVE)
|
||||
. &= ~(MOBILITY_MOVE)
|
||||
else
|
||||
ENABLE_BITFIELD(., MOBILITY_MOVE)
|
||||
. |= MOBILITY_MOVE
|
||||
mobility_flags = .
|
||||
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
// these vars are not really standardized but all would theoretically create stuff on death
|
||||
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars)
|
||||
mob.vars[v] = null
|
||||
ENABLE_BITFIELD(mob.flags_1, HOLOGRAM_1)
|
||||
mob.flags_1 |= HOLOGRAM_1
|
||||
if(isliving(mob))
|
||||
var/mob/living/L = mob
|
||||
L.vore_flags = 0
|
||||
|
||||
@@ -59,12 +59,12 @@
|
||||
/obj/structure/fermenting_barrel/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
open = !open
|
||||
if(open)
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE)
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, REFILLABLE)
|
||||
reagents.reagents_holder_flags &= ~(DRAINABLE)
|
||||
reagents.reagents_holder_flags |= REFILLABLE
|
||||
to_chat(user, "<span class='notice'>You open [src], letting you fill it.</span>")
|
||||
else
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, REFILLABLE)
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE)
|
||||
reagents.reagents_holder_flags &= ~(REFILLABLE)
|
||||
reagents.reagents_holder_flags |= DRAINABLE
|
||||
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
|
||||
update_icon()
|
||||
|
||||
@@ -96,12 +96,12 @@
|
||||
/obj/structure/custom_keg/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
open = !open
|
||||
if(open)
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE)
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, REFILLABLE)
|
||||
reagents.reagents_holder_flags &= ~(DRAINABLE)
|
||||
reagents.reagents_holder_flags |= REFILLABLE
|
||||
to_chat(user, "<span class='notice'>You open [src], letting you fill it.</span>")
|
||||
else
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, REFILLABLE)
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE)
|
||||
reagents.reagents_holder_flags &= ~(REFILLABLE)
|
||||
reagents.reagents_holder_flags |= DRAINABLE
|
||||
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -365,7 +365,7 @@
|
||||
opened = TRUE
|
||||
spillable = !screwdrivered
|
||||
reagent_flags = OPENCONTAINER
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
icon_state = screwdrivered ? "coconut_carved" : "coconut_chopped"
|
||||
desc = "A coconut. [screwdrivered ? "This one's got a hole in it" : "This one's sliced open, with all its delicious contents for your eyes to savour"]."
|
||||
playsound(user, W.hitsound, 50, 1, -1)
|
||||
|
||||
@@ -55,14 +55,14 @@
|
||||
id = "[type]"
|
||||
|
||||
/datum/instrument/proc/Initialize()
|
||||
if(CHECK_BITFIELD(instrument_flags, INSTRUMENT_LEGACY | INSTRUMENT_DO_NOT_AUTOSAMPLE))
|
||||
if(instrument_flags & (INSTRUMENT_LEGACY | INSTRUMENT_DO_NOT_AUTOSAMPLE))
|
||||
return
|
||||
calculate_samples()
|
||||
|
||||
/datum/instrument/proc/ready()
|
||||
if(CHECK_BITFIELD(instrument_flags, INSTRUMENT_LEGACY))
|
||||
if((instrument_flags & INSTRUMENT_LEGACY))
|
||||
return legacy_instrument_path && legacy_instrument_ext
|
||||
else if(CHECK_BITFIELD(instrument_flags, INSTRUMENT_DO_NOT_AUTOSAMPLE))
|
||||
else if((instrument_flags & INSTRUMENT_DO_NOT_AUTOSAMPLE))
|
||||
return length(samples)
|
||||
return (length(samples) >= 128)
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/reagent/injector/Initialize()
|
||||
. = ..()
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
|
||||
/obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype)
|
||||
push_vol()
|
||||
@@ -273,7 +273,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/reagent/storage/Initialize()
|
||||
. = ..()
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
|
||||
/obj/item/integrated_circuit/reagent/storage/do_work()
|
||||
set_pin_data(IC_OUTPUT, 2, WEAKREF(src))
|
||||
@@ -303,7 +303,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/reagent/storage/cryo/Initialize()
|
||||
. = ..()
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags |= NO_REACT
|
||||
|
||||
/obj/item/integrated_circuit/reagent/storage/grinder
|
||||
name = "reagent grinder"
|
||||
@@ -574,7 +574,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/reagent/smoke/Initialize()
|
||||
. = ..()
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
|
||||
/obj/item/integrated_circuit/reagent/smoke/on_reagent_change(changetype)
|
||||
//reset warning only if we have reagents now
|
||||
@@ -632,7 +632,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/reagent/extinguisher/Initialize()
|
||||
.=..()
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= OPENCONTAINER
|
||||
set_pin_data(IC_OUTPUT,2, src)
|
||||
|
||||
/obj/item/integrated_circuit/reagent/extinguisher/on_reagent_change(changetype)
|
||||
|
||||
@@ -184,6 +184,7 @@
|
||||
icon_state = "crusher-glaive"
|
||||
item_state = "crusher0-glaive"
|
||||
block_parry_data = /datum/block_parry_data/crusherglaive
|
||||
obj_flags = UNIQUE_RENAME
|
||||
//ideas: altclick that lets you pummel people with the handguard/handle?
|
||||
//parrying functionality?
|
||||
|
||||
@@ -238,6 +239,36 @@
|
||||
/obj/item/kinetic_crusher/glaive/bone/update_icon_state()
|
||||
item_state = "crusher[wielded]-bone"
|
||||
|
||||
/obj/item/kinetic_crusher/glaive/gauntlets
|
||||
name = "proto-kinetic gauntlets"
|
||||
desc = "A pair of scaled-down proto-kinetic crusher destabilizer modules shoved into gauntlets and greaves, often used by \
|
||||
those who wish to spit in the eyes of God. Sacrifices outright damage for \
|
||||
a reliance on backstabs and the ability to give fauna concussions on a parry."
|
||||
attack_verb = list("pummeled", "punched", "jabbed", "hammer-fisted", "uppercut", "slammed")
|
||||
icon_state = "crusher-hands"
|
||||
item_state = "crusher0-fist"
|
||||
unique_reskin = list("Gauntlets" = "crusher-hands",
|
||||
"Fingerless" = "crusher-hands-bare")
|
||||
detonation_damage = 45 // 60 on wield, compared to normal crusher's 70
|
||||
backstab_bonus = 70 // 130 on backstab though
|
||||
|
||||
/obj/item/kinetic_crusher/glaive/gauntlets/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15)
|
||||
|
||||
/obj/item/kinetic_crusher/glaive/gauntlets/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text)
|
||||
. = ..()
|
||||
if(isliving(attacker))
|
||||
var/mob/living/liv_atk = attacker
|
||||
if(liv_atk.mob_size >= MOB_SIZE_LARGE && !ismegafauna(liv_atk))
|
||||
liv_atk.apply_status_effect(STATUS_EFFECT_GAUNTLET_CONC)
|
||||
|
||||
/obj/item/kinetic_crusher/glaive/gauntlets/update_icon_state()
|
||||
if(current_skin == "Fingerless")
|
||||
item_state = "crusher[wielded]-fistbare"
|
||||
else
|
||||
item_state = "crusher[wielded]-fist"
|
||||
|
||||
//destablizing force
|
||||
/obj/item/projectile/destabilizer
|
||||
name = "destabilizing force"
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
|
||||
new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining/cloned, 3000),
|
||||
new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000),
|
||||
new /datum/data/mining_equipment("Kinetic Glaive Kit", /obj/item/storage/backpack/duffelbag/mining/glaivekit, 2250),
|
||||
new /datum/data/mining_equipment("Premium Kinetic Melee Kit", /obj/item/storage/backpack/duffelbag/mining/glaivekit, 2250),
|
||||
new /datum/data/mining_equipment("Survival Dagger", /obj/item/kitchen/knife/combat/survival/knuckledagger, 550),
|
||||
)
|
||||
|
||||
@@ -166,6 +166,7 @@
|
||||
return
|
||||
I.mining_points -= prize.cost
|
||||
to_chat(usr, "<span class='notice'>[src] clanks to life briefly before vending [prize.equipment_name]!</span>")
|
||||
playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
|
||||
new prize.equipment_path(loc)
|
||||
SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]"))
|
||||
. = TRUE
|
||||
@@ -187,6 +188,9 @@
|
||||
if(istype(I, /obj/item/suit_voucher))
|
||||
RedeemSVoucher(I, user)
|
||||
return
|
||||
if(istype(I, /obj/item/premium_crusher_voucher))
|
||||
RedeemPCVoucher(I, user)
|
||||
return
|
||||
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
|
||||
updateUsrDialog()
|
||||
return
|
||||
@@ -226,10 +230,46 @@
|
||||
new /obj/item/kinetic_crusher(drop_location)
|
||||
if("Mining Conscription Kit")
|
||||
new /obj/item/storage/backpack/duffelbag/mining/conscript(drop_location)
|
||||
|
||||
playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
|
||||
SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection)
|
||||
qdel(voucher)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer)
|
||||
var/items = list( "Exo-suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "exo"),
|
||||
"SEVA suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "seva"))
|
||||
|
||||
var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE)
|
||||
if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
|
||||
return
|
||||
var/drop_location = drop_location()
|
||||
switch(selection)
|
||||
if("Exo-suit")
|
||||
new /obj/item/clothing/suit/hooded/explorer/exo(drop_location)
|
||||
new /obj/item/clothing/mask/gas/exo(drop_location)
|
||||
if("SEVA suit")
|
||||
new /obj/item/clothing/suit/hooded/explorer/seva(drop_location)
|
||||
new /obj/item/clothing/mask/gas/seva(drop_location)
|
||||
playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
|
||||
SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection)
|
||||
qdel(voucher)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/proc/RedeemPCVoucher(obj/item/premium_crusher_voucher/voucher, mob/redeemer) // someone should REALLY just refactor this
|
||||
var/items = list("Kinetic Glaive" = image(icon = 'icons/obj/mining.dmi', icon_state = "crusher-glaive"),
|
||||
"Kinetic Gauntlets" = image(icon = 'icons/obj/mining.dmi', icon_state = "crusher-hands"))
|
||||
|
||||
var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE)
|
||||
if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
|
||||
return
|
||||
var/drop_location = drop_location()
|
||||
switch(selection)
|
||||
if("Kinetic Glaive")
|
||||
new /obj/item/kinetic_crusher/glaive(drop_location)
|
||||
if("Kinetic Gauntlets")
|
||||
new /obj/item/kinetic_crusher/glaive/gauntlets(drop_location)
|
||||
playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
|
||||
SSblackbox.record_feedback("tally", "crusher_voucher_redeemed", 1, selection)
|
||||
qdel(voucher)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
|
||||
do_sparks(5, TRUE, src)
|
||||
if(prob(50 / severity) && severity < 3)
|
||||
@@ -245,7 +285,7 @@
|
||||
. = ..()
|
||||
desc += "\nIt seems a few selections have been added."
|
||||
prize_list += list(
|
||||
new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/mining, 250),
|
||||
new /datum/data/mining_equipment("Extra ID", /obj/item/card/id/mining, 250),
|
||||
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
|
||||
new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/cube/monkey, 300),
|
||||
new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350),
|
||||
@@ -273,6 +313,13 @@
|
||||
icon_state = "mining_voucher"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
/obj/item/premium_crusher_voucher
|
||||
name = "premium crusher voucher"
|
||||
desc = "A token to redeem for a premium proto-kinetic melee weapon. Use it on a mining equipment vendor."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "mining_voucher"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
/**********************Mining Point Card**********************/
|
||||
//mp = Miner Pointers
|
||||
//c = Cash
|
||||
@@ -375,24 +422,5 @@
|
||||
/obj/item/storage/backpack/duffelbag/mining/glaivekit
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/mining/glaivekit/PopulateContents()
|
||||
new /obj/item/kinetic_crusher/glaive(src)
|
||||
new /obj/item/kitchen/knife/combat/survival/knuckledagger(src)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer)
|
||||
var/items = list( "Exo-suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "exo"),
|
||||
"SEVA suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "seva"))
|
||||
|
||||
var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE)
|
||||
if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
|
||||
return
|
||||
var/drop_location = drop_location()
|
||||
switch(selection)
|
||||
if("Exo-suit")
|
||||
new /obj/item/clothing/suit/hooded/explorer/exo(drop_location)
|
||||
new /obj/item/clothing/mask/gas/exo(drop_location)
|
||||
if("SEVA suit")
|
||||
new /obj/item/clothing/suit/hooded/explorer/seva(drop_location)
|
||||
new /obj/item/clothing/mask/gas/seva(drop_location)
|
||||
|
||||
SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection)
|
||||
qdel(voucher)
|
||||
new /obj/item/premium_crusher_voucher(src)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/datum/sprite_accessory/mam_body_markings/redpanda
|
||||
name = "Redpanda"
|
||||
icon_state = "redpanda"
|
||||
covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/bat
|
||||
name = "Bat"
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
if(start_T && end_T)
|
||||
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
|
||||
|
||||
else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
|
||||
else if(!(I.item_flags & ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
|
||||
thrown_thing = I
|
||||
dropItemToGround(I)
|
||||
|
||||
@@ -621,12 +621,12 @@
|
||||
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
|
||||
set_resting(TRUE, FALSE, FALSE)
|
||||
SEND_SIGNAL(src, COMSIG_DISABLE_COMBAT_MODE)
|
||||
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT)
|
||||
combat_flags |= COMBAT_FLAG_HARD_STAMCRIT
|
||||
filters += CIT_FILTER_STAMINACRIT
|
||||
update_mobility()
|
||||
if((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && total_health <= STAMINA_CRIT_REMOVAL_THRESHOLD)
|
||||
to_chat(src, "<span class='notice'>You don't feel nearly as exhausted anymore.</span>")
|
||||
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_HARD_STAMCRIT)
|
||||
combat_flags &= ~(COMBAT_FLAG_HARD_STAMCRIT)
|
||||
filters -= CIT_FILTER_STAMINACRIT
|
||||
update_mobility()
|
||||
UpdateStaminaBuffer()
|
||||
|
||||
@@ -22,14 +22,14 @@
|
||||
|
||||
/mob/living/carbon/Moved()
|
||||
. = ..()
|
||||
if(. && !CHECK_BITFIELD(movement_type, FLOATING)) //floating is easy
|
||||
if(. && !(movement_type & FLOATING)) //floating is easy
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous
|
||||
else if(nutrition && stat != DEAD)
|
||||
var/loss = HUNGER_FACTOR/10
|
||||
if(m_intent == MOVE_INTENT_RUN)
|
||||
loss *= 2
|
||||
adjust_nutrition(loss)
|
||||
adjust_nutrition(-loss)
|
||||
|
||||
/mob/living/carbon/can_move_under_living(mob/living/other)
|
||||
. = ..()
|
||||
|
||||
@@ -113,11 +113,11 @@
|
||||
. += effects_exam
|
||||
|
||||
//CIT CHANGES START HERE - adds genital details to examine text
|
||||
if(LAZYLEN(internal_organs) && CHECK_BITFIELD(user.client?.prefs.cit_toggles, GENITAL_EXAMINE))
|
||||
if(LAZYLEN(internal_organs) && (user.client?.prefs.cit_toggles & GENITAL_EXAMINE))
|
||||
for(var/obj/item/organ/genital/dicc in internal_organs)
|
||||
if(istype(dicc) && dicc.is_exposed())
|
||||
. += "[dicc.desc]"
|
||||
if(CHECK_BITFIELD(user.client?.prefs.cit_toggles, VORE_EXAMINE))
|
||||
if(user.client?.prefs.cit_toggles & VORE_EXAMINE)
|
||||
var/cursed_stuff = attempt_vr(src,"examine_bellies",args) //vore Code
|
||||
if(cursed_stuff)
|
||||
. += cursed_stuff
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
H.add_movespeed_modifier(/datum/movespeed_modifier/slime_puddle)
|
||||
|
||||
ENABLE_BITFIELD(H.pass_flags, PASSMOB) //this actually lets people pass over you
|
||||
H.pass_flags |= PASSMOB //this actually lets people pass over you
|
||||
squeak = H.AddComponent(/datum/component/squeak, custom_sounds = list('sound/effects/blobattack.ogg')) //blorble noise when people step on you
|
||||
|
||||
//if the user is a changeling, retract their sting
|
||||
@@ -103,7 +103,7 @@
|
||||
REMOVE_TRAIT(H, TRAIT_HUMAN_NO_RENDER, SLIMEPUDDLE_TRAIT)
|
||||
H.update_disabled_bodyparts(silent = TRUE)
|
||||
H.remove_movespeed_modifier(/datum/movespeed_modifier/slime_puddle)
|
||||
DISABLE_BITFIELD(H.pass_flags, PASSMOB)
|
||||
H.pass_flags &= ~(PASSMOB)
|
||||
is_puddle = FALSE
|
||||
if(squeak)
|
||||
squeak.RemoveComponent()
|
||||
|
||||
@@ -188,9 +188,9 @@
|
||||
dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop.
|
||||
if(l_store)
|
||||
dropItemToGround(l_store, TRUE)
|
||||
if(wear_id && !CHECK_BITFIELD(wear_id.item_flags, NO_UNIFORM_REQUIRED))
|
||||
if(wear_id && !(wear_id.item_flags & NO_UNIFORM_REQUIRED))
|
||||
dropItemToGround(wear_id)
|
||||
if(belt && !CHECK_BITFIELD(belt.item_flags, NO_UNIFORM_REQUIRED))
|
||||
if(belt && !(belt.item_flags & NO_UNIFORM_REQUIRED))
|
||||
dropItemToGround(belt)
|
||||
w_uniform = null
|
||||
update_suit_sensors()
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
var/missing_body_parts_flags = ~get_body_parts_flags()
|
||||
var/max_protection = 1
|
||||
if(missing_body_parts_flags) //I don't like copypasta as much as proc overhead. Do you want me to make these into a macro?
|
||||
DISABLE_BITFIELD(thermal_protection_flags, missing_body_parts_flags)
|
||||
thermal_protection_flags &= ~(missing_body_parts_flags)
|
||||
if(missing_body_parts_flags & HEAD)
|
||||
max_protection -= THERMAL_PROTECTION_HEAD
|
||||
if(missing_body_parts_flags & CHEST)
|
||||
|
||||
@@ -1243,7 +1243,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(SLOT_BELT)
|
||||
if(H.belt)
|
||||
return FALSE
|
||||
if(!CHECK_BITFIELD(I.item_flags, NO_UNIFORM_REQUIRED))
|
||||
if(!(I.item_flags & NO_UNIFORM_REQUIRED))
|
||||
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
|
||||
if(!H.w_uniform && !nojumpsuit && (!O || !O.is_robotic_limb()))
|
||||
if(return_warning)
|
||||
@@ -1285,7 +1285,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
if(SLOT_WEAR_ID)
|
||||
if(H.wear_id)
|
||||
return FALSE
|
||||
if(!CHECK_BITFIELD(I.item_flags, NO_UNIFORM_REQUIRED))
|
||||
if(!(I.item_flags & NO_UNIFORM_REQUIRED))
|
||||
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
|
||||
if(!H.w_uniform && !nojumpsuit && (!O || !O.is_robotic_limb()))
|
||||
if(return_warning)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
|
||||
. = ..()
|
||||
DISABLE_BITFIELD(H.flags_1, HEAR_1)
|
||||
H.flags_1 &= ~(HEAR_1)
|
||||
var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
if(head)
|
||||
if(pumpkin)//Pumpkinhead!
|
||||
@@ -49,7 +49,7 @@
|
||||
OA.Trigger()
|
||||
|
||||
/datum/species/dullahan/on_species_loss(mob/living/carbon/human/H)
|
||||
ENABLE_BITFIELD(H.flags_1, HEAR_1)
|
||||
H.flags_1 |= HEAR_1
|
||||
H.reset_perspective(H)
|
||||
if(myhead)
|
||||
var/obj/item/dullahan_relay/DR = myhead
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
|
||||
if(!HAS_TRAIT(src, TRAIT_NO_INTERNALS))
|
||||
for(check in GET_INTERNAL_SLOTS(src))
|
||||
if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
|
||||
if((check.clothing_flags & ALLOWINTERNALS))
|
||||
internals = TRUE
|
||||
if(internal)
|
||||
if(internal.loc != src)
|
||||
|
||||
@@ -116,28 +116,28 @@
|
||||
to_chat(src, "<span class='warning'>[L] is restraining [P], you cannot push past.</span>")
|
||||
return 1
|
||||
|
||||
//CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks without a short delay
|
||||
if(!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(L, MOBILITY_STAND))
|
||||
//CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks or over prone bodies without a short delay
|
||||
if(!CHECK_MOBILITY(src, MOBILITY_STAND))
|
||||
var/origtargetloc = L.loc
|
||||
if(!pulledby)
|
||||
if(combat_flags & COMBAT_FLAG_ATTEMPTING_CRAWL)
|
||||
return TRUE
|
||||
if(IS_STAMCRIT(src))
|
||||
to_chat(src, "<span class='warning'>You're too exhausted to crawl under [L].</span>")
|
||||
to_chat(src, "<span class='warning'>You're too exhausted to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under": "over"] [L].</span>")
|
||||
return TRUE
|
||||
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
|
||||
visible_message("<span class='notice'>[src] is attempting to crawl under [L].</span>",
|
||||
"<span class='notice'>You are now attempting to crawl under [L].</span>",
|
||||
target = L, target_message = "<span class='notice'>[src] is attempting to crawl under you.</span>")
|
||||
combat_flags &= COMBAT_FLAG_ATTEMPTING_CRAWL
|
||||
visible_message("<span class='notice'>[src] is attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under" : "over"] [L].</span>",
|
||||
"<span class='notice'>You are now attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under": "over"] [L].</span>",
|
||||
target = L, target_message = "<span class='notice'>[src] is attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under" : "over"] you.</span>")
|
||||
if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND))
|
||||
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
|
||||
combat_flags &= ~(COMBAT_FLAG_ATTEMPTING_CRAWL)
|
||||
return TRUE
|
||||
var/src_passmob = (pass_flags & PASSMOB)
|
||||
pass_flags |= PASSMOB
|
||||
Move(origtargetloc)
|
||||
if(!src_passmob)
|
||||
pass_flags &= ~PASSMOB
|
||||
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL)
|
||||
combat_flags &= ~(COMBAT_FLAG_ATTEMPTING_CRAWL)
|
||||
return TRUE
|
||||
//END OF CIT CHANGES
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
set name = "Rest"
|
||||
set category = "IC"
|
||||
if(client?.prefs?.autostand)
|
||||
TOGGLE_BITFIELD(combat_flags, COMBAT_FLAG_INTENTIONALLY_RESTING)
|
||||
(combat_flags ^= COMBAT_FLAG_INTENTIONALLY_RESTING)
|
||||
to_chat(src, "<span class='notice'>You are now attempting to [(combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].</span>")
|
||||
if((combat_flags & COMBAT_FLAG_INTENTIONALLY_RESTING) && !resting)
|
||||
set_resting(TRUE, FALSE)
|
||||
@@ -117,14 +117,14 @@
|
||||
mobility_flags &= ~(MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE | MOBILITY_HOLD)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MOBILITY_NOMOVE))
|
||||
DISABLE_BITFIELD(mobility_flags, MOBILITY_MOVE)
|
||||
mobility_flags &= ~(MOBILITY_MOVE)
|
||||
if(HAS_TRAIT(src, TRAIT_MOBILITY_NOPICKUP))
|
||||
DISABLE_BITFIELD(mobility_flags, MOBILITY_PICKUP)
|
||||
mobility_flags &= ~(MOBILITY_PICKUP)
|
||||
if(HAS_TRAIT(src, TRAIT_MOBILITY_NOUSE))
|
||||
DISABLE_BITFIELD(mobility_flags, MOBILITY_USE)
|
||||
mobility_flags &= ~(MOBILITY_USE)
|
||||
|
||||
if(daze)
|
||||
DISABLE_BITFIELD(mobility_flags, MOBILITY_USE)
|
||||
mobility_flags &= ~(MOBILITY_USE)
|
||||
|
||||
//Handle update-effects.
|
||||
if(!CHECK_MOBILITY(src, MOBILITY_HOLD))
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
if(mover in buckled_mobs)
|
||||
return TRUE
|
||||
var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit
|
||||
if(isliving(L) && lying && L.lying) //if we're both lying down and aren't already being thrown/shipped around, don't pass
|
||||
return FALSE
|
||||
return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density))
|
||||
|
||||
/mob/living/toggle_move_intent()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
return
|
||||
if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
return
|
||||
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
combat_flags |= COMBAT_FLAG_SPRINT_ACTIVE
|
||||
add_movespeed_modifier(/datum/movespeed_modifier/sprinting)
|
||||
if(update_icon)
|
||||
update_sprint_icon()
|
||||
@@ -38,7 +38,7 @@
|
||||
/mob/living/proc/disable_sprint_mode(update_icon = TRUE)
|
||||
if(!(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) || (combat_flags & COMBAT_FLAG_SPRINT_FORCED))
|
||||
return
|
||||
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
combat_flags &= ~(COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
remove_movespeed_modifier(/datum/movespeed_modifier/sprinting)
|
||||
if(update_icon)
|
||||
update_sprint_icon()
|
||||
@@ -46,7 +46,7 @@
|
||||
/mob/living/proc/enable_intentional_sprint_mode()
|
||||
if((combat_flags & COMBAT_FLAG_SPRINT_TOGGLED) && (combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
|
||||
return
|
||||
ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED)
|
||||
combat_flags |= COMBAT_FLAG_SPRINT_TOGGLED
|
||||
if(!HAS_TRAIT(src, TRAIT_SPRINT_LOCKED) && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE))
|
||||
enable_sprint_mode(FALSE)
|
||||
update_sprint_icon()
|
||||
@@ -57,7 +57,7 @@
|
||||
return
|
||||
if(combat_flags & COMBAT_FLAG_SPRINT_FORCED)
|
||||
return
|
||||
DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_SPRINT_TOGGLED)
|
||||
combat_flags &= ~(COMBAT_FLAG_SPRINT_TOGGLED)
|
||||
if(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)
|
||||
disable_sprint_mode(FALSE)
|
||||
update_sprint_icon()
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
deputize(W, user)
|
||||
|
||||
else if(istype(W, /obj/item/mop/advanced))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_CLEANER_ADVANCED_MOP))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_CLEANER_ADVANCED_MOP))
|
||||
to_chat(user, "<span class='notice'>You replace \the [src] old mop with a new better one!</span>")
|
||||
upgrades |= UPGRADE_CLEANER_ADVANCED_MOP
|
||||
clean_time = 20 //2.5 the speed!
|
||||
@@ -198,7 +198,7 @@
|
||||
to_chat(user, "<span class='notice'>The [src] already has this mop!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/broom))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_CLEANER_BROOM))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_CLEANER_BROOM))
|
||||
to_chat(user, "<span class='notice'>You add to \the [src] a broom speeding it up!</span>")
|
||||
upgrades |= UPGRADE_CLEANER_BROOM
|
||||
base_speed = 1 //2x faster!
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
to_chat(user, "<span class='warning'>You need at least one floor tile to put into [src]!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/storage/toolbox/artistic))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_FLOOR_ARTBOX))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_FLOOR_ARTBOX))
|
||||
to_chat(user, "<span class='notice'>You upgrade \the [src] case to hold more!</span>")
|
||||
upgrades |= UPGRADE_FLOOR_ARTBOX
|
||||
maxtiles += 100 //Double the storage!
|
||||
@@ -139,7 +139,7 @@
|
||||
to_chat(user, "<span class='notice'>The [src] already has a upgraded case!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/storage/toolbox/syndicate))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_FLOOR_SYNDIBOX))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_FLOOR_SYNDIBOX))
|
||||
to_chat(user, "<span class='notice'>You upgrade \the [src] case to hold more!</span>")
|
||||
upgrades |= UPGRADE_FLOOR_SYNDIBOX
|
||||
maxtiles += 200 //Double bse storage
|
||||
@@ -433,4 +433,4 @@
|
||||
if(robot.mode == BOT_REPAIRING)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
show_controls(user)
|
||||
|
||||
else if(istype(W, /obj/item/reagent_containers/syringe/piercing))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_PIERERCING))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_MEDICAL_PIERERCING))
|
||||
to_chat(user, "<span class='notice'>You replace \the [src] syringe with a diamond-tipped one!</span>")
|
||||
upgrades |= UPGRADE_MEDICAL_PIERERCING
|
||||
qdel(W)
|
||||
@@ -268,7 +268,7 @@
|
||||
to_chat(user, "<span class='notice'>The [src] already has a diamond-tipped syringe!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/hypospray/mkii))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_HYPOSPRAY))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_MEDICAL_HYPOSPRAY))
|
||||
to_chat(user, "<span class='notice'>You replace \the [src] syringe base with a DeForest Medical MK.II Hypospray!</span>")
|
||||
upgrades |= UPGRADE_MEDICAL_HYPOSPRAY
|
||||
injection_time = 15 //Half the time half the death!
|
||||
@@ -284,7 +284,7 @@
|
||||
to_chat(user, "<span class='notice'>The [src] already has a DeForest Medical Hypospray base!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/circuitboard/machine/chem_dispenser))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_CHEM_BOARD))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_MEDICAL_CHEM_BOARD))
|
||||
to_chat(user, "<span class='notice'>You add in the board upgrading \the [src] reagent banks!</span>")
|
||||
upgrades |= UPGRADE_MEDICAL_CHEM_BOARD
|
||||
treatment_oxy = /datum/reagent/medicine/salbutamol //Replaces Dex with salbutamol "better" healing of o2
|
||||
@@ -299,7 +299,7 @@
|
||||
to_chat(user, "<span class='notice'>The [src] already has this upgrade!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/circuitboard/machine/cryo_tube))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_CRYO_BOARD))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_MEDICAL_CRYO_BOARD))
|
||||
to_chat(user, "<span class='notice'>You add in the board upgrading \the [src] reagent banks!</span>")
|
||||
upgrades |= UPGRADE_MEDICAL_CRYO_BOARD
|
||||
treatment_fire = /datum/reagent/medicine/oxandrolone //Replaces Kep with oxandrolone "better" healing of burns
|
||||
@@ -314,7 +314,7 @@
|
||||
to_chat(user, "<span class='notice'>The [src] already has this upgrade!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/circuitboard/machine/chem_master))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_CHEM_MASTER))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_MEDICAL_CHEM_MASTER))
|
||||
to_chat(user, "<span class='notice'>You add in the board upgrading \the [src] reagent banks!</span>")
|
||||
upgrades |= UPGRADE_MEDICAL_CHEM_MASTER
|
||||
treatment_brute = /datum/reagent/medicine/sal_acid //Replaces Bic with Sal Acid "better" healing of brute
|
||||
@@ -329,7 +329,7 @@
|
||||
to_chat(user, "<span class='notice'>the [src] already has this upgrade!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/circuitboard/machine/sleeper))
|
||||
if(bot_core.allowed(user) && open && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_SLEEP_BOARD))
|
||||
if(bot_core.allowed(user) && open && !(upgrades & UPGRADE_MEDICAL_SLEEP_BOARD))
|
||||
to_chat(user, "<span class='notice'>You add in the board upgrading \the [src] reagent banks!</span>")
|
||||
upgrades |= UPGRADE_MEDICAL_SLEEP_BOARD
|
||||
treatment_tox = /datum/reagent/medicine/pen_acid //replaces charcoal with pen acid a "better" healing of toxins
|
||||
@@ -359,7 +359,7 @@
|
||||
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
|
||||
flick("medibot_spark", src)
|
||||
playsound(src, "sparks", 75, 1)
|
||||
if(!CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_PIERERCING))
|
||||
if(!(upgrades & UPGRADE_MEDICAL_PIERERCING))
|
||||
upgrades |= UPGRADE_MEDICAL_PIERERCING //Jabs even harder through the clothing!
|
||||
if(user)
|
||||
oldpatient = user
|
||||
@@ -558,7 +558,7 @@
|
||||
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing) && !CHECK_BITFIELD(upgrades,UPGRADE_MEDICAL_PIERERCING))
|
||||
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing) && !(upgrades & UPGRADE_MEDICAL_PIERERCING))
|
||||
var/obj/item/clothing/CS = H.wear_suit
|
||||
var/obj/item/clothing/CH = H.head
|
||||
if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL)
|
||||
|
||||
@@ -367,7 +367,7 @@
|
||||
if(vore_active)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(!client && L.Adjacent(src) && CHECK_BITFIELD(L.vore_flags, DEVOURABLE) && CHECK_BITFIELD(L.vore_flags, MOBVORE)) // aggressive check to ensure vore attacks can be made
|
||||
if(!client && L.Adjacent(src) && (L.vore_flags & DEVOURABLE) && (L.vore_flags & MOBVORE)) // aggressive check to ensure vore attacks can be made
|
||||
if(prob(voracious_chance))
|
||||
vore_attack(src,L,src)
|
||||
else
|
||||
|
||||
@@ -59,6 +59,7 @@ Difficulty: Medium
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize()
|
||||
. = ..()
|
||||
internal = new/obj/item/gps/internal/miner(src)
|
||||
miner_saw = new(src)
|
||||
|
||||
/datum/action/innate/megafauna_attack/dash
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
if(!client && ranged && ranged_cooldown <= world.time)
|
||||
OpenFire()
|
||||
if(L.Adjacent(src) && (L.stat != CONSCIOUS))
|
||||
if(vore_active && CHECK_BITFIELD(L.vore_flags,DEVOURABLE))
|
||||
if(vore_active && (L.vore_flags & DEVOURABLE))
|
||||
vore_attack(src,L,src)
|
||||
LoseTarget()
|
||||
else
|
||||
|
||||
@@ -49,10 +49,10 @@
|
||||
|
||||
// Simple animals have only one belly. This creates it (if it isn't already set up)
|
||||
/mob/living/simple_animal/init_vore()
|
||||
ENABLE_BITFIELD(vore_flags, VORE_INIT)
|
||||
if(CHECK_BITFIELD(flags_1, HOLOGRAM_1))
|
||||
vore_flags |= VORE_INIT
|
||||
if((flags_1 & HOLOGRAM_1))
|
||||
return
|
||||
if(!vore_active || CHECK_BITFIELD(vore_flags, NO_VORE)) //If it can't vore, let's not give it a stomach.
|
||||
if(!vore_active || (vore_flags & NO_VORE)) //If it can't vore, let's not give it a stomach.
|
||||
return
|
||||
if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with.
|
||||
verbs |= /mob/living/simple_animal/proc/animal_nom
|
||||
@@ -133,6 +133,6 @@
|
||||
|
||||
if (stat != CONSCIOUS)
|
||||
return
|
||||
if(!CHECK_BITFIELD(T.vore_flags,DEVOURABLE))
|
||||
if(!(T.vore_flags & DEVOURABLE))
|
||||
return
|
||||
return vore_attack(src,T,src)
|
||||
|
||||
@@ -466,7 +466,7 @@
|
||||
|
||||
SStun = world.time + rand(20,60)
|
||||
spawn(0)
|
||||
DISABLE_BITFIELD(mobility_flags, MOBILITY_MOVE)
|
||||
mobility_flags &= ~(MOBILITY_MOVE)
|
||||
if(user)
|
||||
step_away(src,user,15)
|
||||
sleep(3)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/simple_animal/slime/update_mobility()
|
||||
. = ..()
|
||||
if(Tempstun && !buckled)
|
||||
DISABLE_BITFIELD(., MOBILITY_MOVE)
|
||||
. &= ~(MOBILITY_MOVE)
|
||||
mobility_flags = .
|
||||
|
||||
@@ -167,3 +167,6 @@
|
||||
|
||||
/datum/movespeed_modifier/dragon_depression
|
||||
multiplicative_slowdown = 5
|
||||
|
||||
/datum/movespeed_modifier/gauntlet_concussion
|
||||
multiplicative_slowdown = 5
|
||||
|
||||
@@ -300,7 +300,7 @@
|
||||
area.power_equip = FALSE
|
||||
area.power_environ = FALSE
|
||||
area.power_change()
|
||||
area.poweralert(FALSE, src)
|
||||
area.poweralert(TRUE, src)
|
||||
if(occupier)
|
||||
malfvacate(1)
|
||||
qdel(wires)
|
||||
@@ -1444,8 +1444,6 @@
|
||||
lighting = autoset(lighting, AUTOSET_ON)
|
||||
environ = autoset(environ, AUTOSET_ON)
|
||||
area.poweralert(FALSE, src)
|
||||
if(cell.percent() > 75)
|
||||
area.poweralert(FALSE, src)
|
||||
|
||||
// now trickle-charge the cell
|
||||
if(chargemode && charging == APC_CHARGING && operating)
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/noreact/Initialize()
|
||||
. = ..()
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags |= NO_REACT
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/bioterror
|
||||
desc = "A shotgun dart filled with an obscene amount of lethal reagents. God help whoever is shot with this."
|
||||
|
||||
@@ -362,7 +362,7 @@
|
||||
|
||||
/obj/item/projectile/proc/process_hit(turf/T, atom/target, qdel_self, hit_something = FALSE) //probably needs to be reworked entirely when pixel movement is done.
|
||||
if(QDELETED(src) || !T || !target) //We're done, nothing's left.
|
||||
if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE)))
|
||||
if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !(movement_type & UNSTOPPABLE)))
|
||||
qdel(src)
|
||||
return hit_something
|
||||
permutated |= target //Make sure we're never hitting it again. If we ever run into weirdness with piercing projectiles needing to hit something multiple times.. well.. that's a to-do.
|
||||
@@ -370,16 +370,16 @@
|
||||
return process_hit(T, select_target(T), qdel_self, hit_something) //Hit whatever else we can since that didn't work.
|
||||
var/result = target.bullet_act(src, def_zone)
|
||||
if(result == BULLET_ACT_FORCE_PIERCE)
|
||||
if(!CHECK_BITFIELD(movement_type, UNSTOPPABLE))
|
||||
if(!(movement_type & UNSTOPPABLE))
|
||||
temporary_unstoppable_movement = TRUE
|
||||
ENABLE_BITFIELD(movement_type, UNSTOPPABLE)
|
||||
movement_type |= UNSTOPPABLE
|
||||
return process_hit(T, select_target(T), qdel_self, TRUE) //Hit whatever else we can since we're piercing through but we're still on the same tile.
|
||||
else if(result == BULLET_ACT_TURF) //We hit the turf but instead we're going to also hit something else on it.
|
||||
return process_hit(T, select_target(T), QDEL_SELF, TRUE)
|
||||
else //Whether it hit or blocked, we're done!
|
||||
qdel_self = QDEL_SELF
|
||||
hit_something = TRUE
|
||||
if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE)))
|
||||
if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !(movement_type & UNSTOPPABLE)))
|
||||
qdel(src)
|
||||
return hit_something
|
||||
|
||||
@@ -775,7 +775,7 @@
|
||||
if(.)
|
||||
if(temporary_unstoppable_movement)
|
||||
temporary_unstoppable_movement = FALSE
|
||||
DISABLE_BITFIELD(movement_type, UNSTOPPABLE)
|
||||
movement_type &= ~(UNSTOPPABLE)
|
||||
if(fired && can_hit_target(original, permutated, TRUE))
|
||||
Bump(original)
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"<span class='userdanger'>You were protected against \the [src]!</span>")
|
||||
|
||||
..(target, blocked)
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||
reagents.reagents_holder_flags &= ~(NO_REACT)
|
||||
reagents.handle_reactions()
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
/obj/item/projectile/curse_hand/prehit(atom/target)
|
||||
if(target == original)
|
||||
DISABLE_BITFIELD(movement_type, UNSTOPPABLE)
|
||||
movement_type &= ~(UNSTOPPABLE)
|
||||
else if(!isturf(target))
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -40,7 +40,7 @@
|
||||
if(arm)
|
||||
arm.End()
|
||||
arm = null
|
||||
if(CHECK_BITFIELD(movement_type, UNSTOPPABLE))
|
||||
if((movement_type & UNSTOPPABLE))
|
||||
playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1)
|
||||
var/turf/T = get_step(src, dir)
|
||||
var/obj/effect/temp_visual/dir_setting/curse/hand/leftover = new(T, dir)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#define REM REAGENTS_EFFECT_MULTIPLIER
|
||||
GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
|
||||
/proc/build_name2reagent()
|
||||
|
||||
@@ -47,7 +47,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/C)
|
||||
if(HAS_TRAIT(C, TRAIT_TOXIC_ALCOHOL))
|
||||
C.adjustToxLoss((boozepwr/25)*REM,forced = TRUE)
|
||||
C.adjustToxLoss((boozepwr/25)*REAGENTS_EFFECT_MULTIPLIER,forced = TRUE)
|
||||
else if(C.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER)
|
||||
var/booze_power = boozepwr
|
||||
if(HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker
|
||||
@@ -1365,7 +1365,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/M)
|
||||
M.set_drugginess(50)
|
||||
M.dizziness +=2
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 150)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REAGENTS_EFFECT_MULTIPLIER, 150)
|
||||
if(prob(20) && !holder.has_reagent(/datum/reagent/consumable/ethanol/neuroweak))
|
||||
M.adjustStaminaLoss(10)
|
||||
M.drop_all_held_items()
|
||||
@@ -1376,7 +1376,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
ADD_TRAIT(M, t, type)
|
||||
M.adjustStaminaLoss(10)
|
||||
if(current_cycle > 30)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
if(current_cycle > 50 && prob(15))
|
||||
if(!M.undergoing_cardiac_arrest() && M.can_heartattack())
|
||||
M.set_heartattack(TRUE)
|
||||
@@ -1401,13 +1401,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M)
|
||||
if(holder.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM, 150)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REAGENTS_EFFECT_MULTIPLIER, 150)
|
||||
M.reagents.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 1.5 * REAGENTS_METABOLISM, FALSE)
|
||||
else if(holder.has_reagent(/datum/reagent/toxin/fentanyl))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM, 150)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REAGENTS_EFFECT_MULTIPLIER, 150)
|
||||
M.reagents.remove_reagent(/datum/reagent/toxin/fentanyl, 0.75 * REAGENTS_METABOLISM, FALSE)
|
||||
else
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.5*REM, 150)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.5*REAGENTS_EFFECT_MULTIPLIER, 150)
|
||||
M.dizziness +=2
|
||||
..()
|
||||
|
||||
@@ -1925,7 +1925,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M)
|
||||
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjust_nutrition(-5)
|
||||
M.overeatduration = 0
|
||||
return ..()
|
||||
@@ -1943,7 +1943,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M)
|
||||
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
|
||||
M.adjustToxLoss(0.5*REM, 0)
|
||||
M.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjust_nutrition(-3)
|
||||
M.overeatduration = 0
|
||||
return ..()
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M)
|
||||
if(M.getToxLoss() && prob(20))
|
||||
M.adjustToxLoss(-1*REM, 0)
|
||||
M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
M.adjustStaminaLoss(-0.5*REM, 0)
|
||||
M.adjustStaminaLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -83,30 +83,30 @@
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/crank/overdose_process(mob/living/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustBruteLoss(2*REM, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/crank/addiction_act_stage1(mob/living/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5*REM)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/crank/addiction_act_stage2(mob/living/M)
|
||||
M.adjustToxLoss(5*REM, 0)
|
||||
M.adjustToxLoss(5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/crank/addiction_act_stage3(mob/living/M)
|
||||
M.adjustBruteLoss(5*REM, 0)
|
||||
M.adjustBruteLoss(5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/crank/addiction_act_stage4(mob/living/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REM)
|
||||
M.adjustToxLoss(5*REM, 0)
|
||||
M.adjustBruteLoss(5*REM, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustToxLoss(5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -128,14 +128,14 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/krokodil/overdose_process(mob/living/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25*REM)
|
||||
M.adjustToxLoss(0.25*REM, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustToxLoss(0.25*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/krokodil/addiction_act_stage1(mob/living/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
/datum/reagent/drug/krokodil/addiction_act_stage3(mob/living/M)
|
||||
if(prob(25))
|
||||
to_chat(M, "<span class='danger'>Your skin starts to peel away...</span>")
|
||||
M.adjustBruteLoss(3*REM, 0)
|
||||
M.adjustBruteLoss(3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -155,10 +155,10 @@
|
||||
CHECK_DNA_AND_SPECIES(M)
|
||||
if(!istype(M.dna.species, /datum/species/krokodil_addict))
|
||||
to_chat(M, "<span class='userdanger'>Your skin falls off easily!</span>")
|
||||
M.adjustBruteLoss(50*REM, 0) // holy shit your skin just FELL THE FUCK OFF
|
||||
M.adjustBruteLoss(50*REAGENTS_EFFECT_MULTIPLIER, 0) // holy shit your skin just FELL THE FUCK OFF
|
||||
M.set_species(/datum/species/krokodil_addict)
|
||||
else
|
||||
M.adjustBruteLoss(5*REM, 0)
|
||||
M.adjustBruteLoss(5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -186,14 +186,14 @@
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
to_chat(M, span_notice("[high_message]"))
|
||||
// SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name)
|
||||
M.AdjustStun(-40 * REM * delta_time)
|
||||
M.AdjustKnockdown(-40 * REM * delta_time)
|
||||
M.AdjustUnconscious(-40 * REM * delta_time)
|
||||
M.AdjustParalyzed(-40 * REM * delta_time)
|
||||
M.AdjustImmobilized(-40 * REM * delta_time)
|
||||
M.adjustStaminaLoss(-2 * REM * delta_time, 0)
|
||||
M.Jitter(2 * REM * delta_time)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * delta_time)
|
||||
M.AdjustStun(-40 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.AdjustKnockdown(-40 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.AdjustUnconscious(-40 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.AdjustParalyzed(-40 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.AdjustImmobilized(-40 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.adjustStaminaLoss(-2 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0)
|
||||
M.Jitter(2 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
M.emote(pick("twitch", "shiver"))
|
||||
..()
|
||||
@@ -201,7 +201,7 @@
|
||||
|
||||
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M, delta_time, times_fired)
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
|
||||
for(var/i in 1 to round(4 * REM * delta_time, 1))
|
||||
for(var/i in 1 to round(4 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 1))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(DT_PROB(10, delta_time))
|
||||
M.emote("laugh")
|
||||
@@ -209,8 +209,8 @@
|
||||
M.visible_message(span_danger("[M]'s hands flip out and flail everywhere!"))
|
||||
M.drop_all_held_items()
|
||||
..()
|
||||
M.adjustToxLoss(1 * REM * delta_time, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * delta_time)
|
||||
M.adjustToxLoss(1 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
. = TRUE
|
||||
|
||||
/datum/reagent/drug/methamphetamine/addiction_act_stage1(mob/living/M)
|
||||
@@ -486,8 +486,8 @@
|
||||
H.dna.species.punchstunthreshold += 2
|
||||
|
||||
/datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM)
|
||||
M.adjustToxLoss(1*REM)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
|
||||
if(prob(10))
|
||||
M.adjust_blurriness(2)
|
||||
..()
|
||||
@@ -531,7 +531,7 @@
|
||||
value = REAGENT_VALUE_VERY_RARE
|
||||
|
||||
/datum/reagent/syndicateadrenals/on_mob_life(mob/living/M)
|
||||
M.adjustStaminaLoss(-5*REM)
|
||||
M.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
. = ..()
|
||||
|
||||
/datum/reagent/syndicateadrenals/on_mob_metabolize(mob/living/M)
|
||||
|
||||
@@ -658,10 +658,10 @@
|
||||
/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/M)
|
||||
M.reagents.add_reagent(/datum/reagent/consumable/sugar,3)
|
||||
if(prob(55))
|
||||
M.adjustBruteLoss(-1*REM, 0)
|
||||
M.adjustFireLoss(-1*REM, 0)
|
||||
M.adjustOxyLoss(-1*REM, 0)
|
||||
M.adjustToxLoss(-1*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0, TRUE) //heals TOXINLOVERs
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
@@ -746,9 +746,9 @@
|
||||
. = 1
|
||||
if(prob(20))
|
||||
M.losebreath += 4
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150)
|
||||
M.adjustToxLoss(3*REM,0)
|
||||
M.adjustStaminaLoss(10*REM,0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REAGENTS_EFFECT_MULTIPLIER, 150)
|
||||
M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER,0)
|
||||
M.adjustStaminaLoss(10*REAGENTS_EFFECT_MULTIPLIER,0)
|
||||
M.blur_eyes(5)
|
||||
. = TRUE
|
||||
..()
|
||||
@@ -778,8 +778,8 @@
|
||||
|
||||
/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(80))
|
||||
M.adjustBruteLoss(-1*REM, 0)
|
||||
M.adjustFireLoss(-1*REM, 0)
|
||||
M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = TRUE
|
||||
..()
|
||||
|
||||
@@ -804,7 +804,7 @@
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/stomach/ethereal/stomach = C.getorganslot(ORGAN_SLOT_STOMACH)
|
||||
if(istype(stomach))
|
||||
stomach.adjust_charge(reac_volume * REM)
|
||||
stomach.adjust_charge(reac_volume * REAGENTS_EFFECT_MULTIPLIER)
|
||||
|
||||
/datum/reagent/consumable/liquidelectricity/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(25) && !isethereal(M))
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
mytray.visible_message("<span class='warning'>Nothing happens...</span>")
|
||||
|
||||
/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
|
||||
M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
|
||||
M.reagents.remove_all_type(/datum/reagent/toxin, 5*REAGENTS_EFFECT_MULTIPLIER, 0, 1)
|
||||
M.setCloneLoss(0, 0)
|
||||
M.setOxyLoss(0, 0)
|
||||
M.radiation = 0
|
||||
@@ -299,7 +299,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustFireLoss(-2*REM, 0)
|
||||
M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -309,7 +309,7 @@
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M)
|
||||
M.adjustFireLoss(2*REM, 0)
|
||||
M.adjustFireLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
|
||||
if(L)
|
||||
L.applyOrganDamage(1)
|
||||
@@ -328,15 +328,15 @@
|
||||
|
||||
/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M)
|
||||
if(M.getFireLoss() > 25)
|
||||
M.adjustFireLoss(-4*REM, 0) //Twice as effective as silver sulfadiazine for severe burns
|
||||
M.adjustFireLoss(-4*REAGENTS_EFFECT_MULTIPLIER, 0) //Twice as effective as silver sulfadiazine for severe burns
|
||||
else
|
||||
M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
|
||||
M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0) //But only a quarter as effective for more minor ones
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M)
|
||||
if(M.getFireLoss()) //It only makes existing burns worse
|
||||
M.adjustFireLoss(4.5*REM, 0) // it's going to be healing either 4 or 0.5
|
||||
M.adjustFireLoss(4.5*REAGENTS_EFFECT_MULTIPLIER, 0) // it's going to be healing either 4 or 0.5
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -371,7 +371,7 @@
|
||||
G.use(reac_volume)
|
||||
|
||||
/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-2*REM, 0)
|
||||
M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -381,7 +381,7 @@
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M)
|
||||
M.adjustBruteLoss(2*REM, 0)
|
||||
M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
|
||||
if(L)
|
||||
L.applyOrganDamage(1)
|
||||
@@ -403,8 +403,8 @@
|
||||
|
||||
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/human/M)
|
||||
if(prob(33))
|
||||
M.adjustBruteLoss(-0.5*REM, 0)
|
||||
M.adjustFireLoss(-0.5*REM, 0)
|
||||
M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = TRUE
|
||||
if((HAS_TRAIT(M, TRAIT_NOMARROW)))
|
||||
return ..()
|
||||
@@ -414,10 +414,10 @@
|
||||
if(M.functional_blood() < maximum_reachable) //Can only up to double your effective blood level.
|
||||
var/new_blood_level = min(volume * 5, maximum_reachable)
|
||||
last_added = new_blood_level
|
||||
M.adjust_integration_blood(new_blood_level + (extra_regen * REM))
|
||||
M.adjust_integration_blood(new_blood_level + (extra_regen * REAGENTS_EFFECT_MULTIPLIER))
|
||||
if(prob(33))
|
||||
M.adjustBruteLoss(-0.5*REM, 0)
|
||||
M.adjustFireLoss(-0.5*REM, 0)
|
||||
M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = TRUE
|
||||
..()
|
||||
|
||||
@@ -436,8 +436,8 @@
|
||||
holder.add_reagent(/datum/reagent/consumable/sugar, 1)
|
||||
holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5)
|
||||
if(prob(33))
|
||||
M.adjustBruteLoss(0.5*REM, 0)
|
||||
M.adjustFireLoss(0.5*REM, 0)
|
||||
M.adjustBruteLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = TRUE
|
||||
..()
|
||||
|
||||
@@ -452,9 +452,9 @@
|
||||
|
||||
/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
|
||||
C.hal_screwyhud = SCREWYHUD_HEALTHY
|
||||
C.adjustBruteLoss(-0.25*REM, 0)
|
||||
C.adjustFireLoss(-0.25*REM, 0)
|
||||
C.adjustStaminaLoss(-0.5*REM, 0)
|
||||
C.adjustBruteLoss(-0.25*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
C.adjustFireLoss(-0.25*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
C.adjustStaminaLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -531,7 +531,7 @@
|
||||
pH = 5
|
||||
|
||||
/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(-2*REM, 0)
|
||||
M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
for(var/A in M.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
@@ -551,18 +551,18 @@
|
||||
var/healing = 0.5
|
||||
|
||||
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(-healing*REM, 0)
|
||||
M.adjustOxyLoss(-healing*REM, 0)
|
||||
M.adjustBruteLoss(-healing*REM, 0)
|
||||
M.adjustFireLoss(-healing*REM, 0)
|
||||
M.adjustToxLoss(-healing*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustOxyLoss(-healing*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(-healing*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-healing*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/omnizine/overdose_process(mob/living/M)
|
||||
M.adjustToxLoss(1.5*REM, 0)
|
||||
M.adjustOxyLoss(1.5*REM, 0)
|
||||
M.adjustBruteLoss(1.5*REM, 0)
|
||||
M.adjustFireLoss(1.5*REM, 0)
|
||||
M.adjustToxLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustOxyLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -587,7 +587,7 @@
|
||||
if(R != src)
|
||||
M.reagents.remove_reagent(R.type,2.5)
|
||||
if(M.health > 20)
|
||||
M.adjustToxLoss(2.5*REM, 0)
|
||||
M.adjustToxLoss(2.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -630,7 +630,7 @@
|
||||
|
||||
/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M)
|
||||
M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50
|
||||
M.adjustToxLoss(-2*REM, 0, healtoxinlover)
|
||||
M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0, healtoxinlover)
|
||||
for(var/A in M.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(R != src)
|
||||
@@ -659,15 +659,15 @@
|
||||
|
||||
/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
|
||||
if(M.getBruteLoss() > 25)
|
||||
M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising
|
||||
M.adjustBruteLoss(-4*REAGENTS_EFFECT_MULTIPLIER, 0) //Twice as effective as styptic powder for severe bruising
|
||||
else
|
||||
M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
|
||||
M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0) //But only a quarter as effective for more minor ones
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
|
||||
if(M.getBruteLoss()) //It only makes existing bruises worse
|
||||
M.adjustBruteLoss(4.5*REM, 0) // it's going to be healing either 4 or 0.5
|
||||
M.adjustBruteLoss(4.5*REAGENTS_EFFECT_MULTIPLIER, 0) // it's going to be healing either 4 or 0.5
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -680,7 +680,7 @@
|
||||
pH = 2
|
||||
|
||||
/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOxyLoss(-3*REM, 0)
|
||||
M.adjustOxyLoss(-3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(M.losebreath >= 4)
|
||||
M.losebreath -= 2
|
||||
M.Jitter(5)
|
||||
@@ -696,11 +696,11 @@
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
|
||||
M.adjustOxyLoss(-12*REM, 0)
|
||||
M.adjustOxyLoss(-12*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.silent = max(M.silent, 5)
|
||||
if(prob(33))
|
||||
M.adjustBruteLoss(-0.5*REM, 0)
|
||||
M.adjustFireLoss(-0.5*REM, 0)
|
||||
M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -731,8 +731,8 @@
|
||||
// to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!"))
|
||||
// M.Jitter(10)
|
||||
|
||||
M.AdjustAllImmobility(-20 * REM * delta_time)
|
||||
M.adjustStaminaLoss(-1 * REM * delta_time, FALSE)
|
||||
M.AdjustAllImmobility(-20 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
M.adjustStaminaLoss(-1 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -754,28 +754,28 @@
|
||||
|
||||
/datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.losebreath += 2
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/ephedrine/addiction_act_stage2(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustToxLoss(3*REM, 0)
|
||||
M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.losebreath += 3
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/ephedrine/addiction_act_stage3(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustToxLoss(4*REM, 0)
|
||||
M.adjustToxLoss(4*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.losebreath += 4
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/ephedrine/addiction_act_stage4(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustToxLoss(5*REM, 0)
|
||||
M.adjustToxLoss(5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.losebreath += 5
|
||||
. = 1
|
||||
..()
|
||||
@@ -841,7 +841,7 @@
|
||||
/datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M)
|
||||
if(prob(33))
|
||||
M.drop_all_held_items()
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
M.Dizzy(3)
|
||||
M.Jitter(3)
|
||||
@@ -850,7 +850,7 @@
|
||||
/datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M)
|
||||
if(prob(33))
|
||||
M.drop_all_held_items()
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
M.Dizzy(4)
|
||||
M.Jitter(4)
|
||||
@@ -859,7 +859,7 @@
|
||||
/datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M)
|
||||
if(prob(33))
|
||||
M.drop_all_held_items()
|
||||
M.adjustToxLoss(3*REM, 0)
|
||||
M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
M.Dizzy(5)
|
||||
M.Jitter(5)
|
||||
@@ -907,10 +907,10 @@
|
||||
|
||||
/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M)
|
||||
if(M.health < 0)
|
||||
M.adjustToxLoss(-2*REM, 0)
|
||||
M.adjustBruteLoss(-2*REM, 0)
|
||||
M.adjustFireLoss(-2*REM, 0)
|
||||
M.adjustOxyLoss(-5*REM, 0)
|
||||
M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustOxyLoss(-5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
M.losebreath = 0
|
||||
if(prob(20))
|
||||
@@ -919,7 +919,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/atropine/overdose_process(mob/living/M)
|
||||
M.adjustToxLoss(0.5*REM, 0)
|
||||
M.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
M.Dizzy(1)
|
||||
M.Jitter(1)
|
||||
@@ -936,16 +936,16 @@
|
||||
|
||||
/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M)
|
||||
if(M.health < 0)
|
||||
M.adjustToxLoss(-0.5*REM, 0)
|
||||
M.adjustBruteLoss(-0.5*REM, 0)
|
||||
M.adjustFireLoss(-0.5*REM, 0)
|
||||
M.adjustToxLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(M.oxyloss > 35)
|
||||
M.setOxyLoss(35, 0)
|
||||
if(M.losebreath >= 4)
|
||||
M.losebreath -= 2
|
||||
if(M.losebreath < 0)
|
||||
M.losebreath = 0
|
||||
M.adjustStaminaLoss(-0.5*REM, 0)
|
||||
M.adjustStaminaLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
if(prob(20))
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
@@ -954,8 +954,8 @@
|
||||
|
||||
/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustStaminaLoss(2.5*REM, 0)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustStaminaLoss(2.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.losebreath++
|
||||
. = 1
|
||||
..()
|
||||
@@ -1021,8 +1021,8 @@
|
||||
|
||||
|
||||
/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(0.5*REM, 0)
|
||||
M.adjustFireLoss(0.5*REM, 0)
|
||||
M.adjustBruteLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1033,7 +1033,7 @@
|
||||
pH = 10.4
|
||||
|
||||
/datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C)
|
||||
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM)
|
||||
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
if(prob(10))
|
||||
C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
|
||||
..()
|
||||
@@ -1091,8 +1091,8 @@
|
||||
M.drowsyness = 0
|
||||
M.slurring = 0
|
||||
M.confused = 0
|
||||
M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1)
|
||||
M.adjustToxLoss(-0.2*REM, 0)
|
||||
M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REAGENTS_EFFECT_MULTIPLIER, 0, 1)
|
||||
M.adjustToxLoss(-0.2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.drunkenness = max(H.drunkenness - 10, 0)
|
||||
@@ -1120,20 +1120,20 @@
|
||||
|
||||
/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M)
|
||||
if(M.health < 50 && M.health > 0)
|
||||
M.adjustOxyLoss(-1*REM, FALSE)
|
||||
M.adjustToxLoss(-1*REM, FALSE)
|
||||
M.adjustBruteLoss(-1*REM, FALSE)
|
||||
M.adjustFireLoss(-1*REM, FALSE)
|
||||
M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.AdjustAllImmobility(-60, FALSE)
|
||||
M.AdjustUnconscious(-60, FALSE)
|
||||
M.adjustStaminaLoss(-20*REM, FALSE)
|
||||
M.adjustStaminaLoss(-20*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/stimulants/overdose_process(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustStaminaLoss(2.5*REM, FALSE)
|
||||
M.adjustToxLoss(1*REM, FALSE)
|
||||
M.adjustStaminaLoss(2.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.losebreath++
|
||||
. = 1
|
||||
..()
|
||||
@@ -1162,12 +1162,12 @@
|
||||
pH = 5
|
||||
|
||||
/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-2*REM, FALSE)
|
||||
M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
|
||||
M.adjustBruteLoss(4*REM, FALSE)
|
||||
M.adjustBruteLoss(4*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1180,12 +1180,12 @@
|
||||
pH = 9.7
|
||||
|
||||
/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOxyLoss(-2*REM, FALSE)
|
||||
M.adjustOxyLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
|
||||
M.adjustOxyLoss(4*REM, FALSE)
|
||||
M.adjustOxyLoss(4*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1198,12 +1198,12 @@
|
||||
pH = 9
|
||||
|
||||
/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustFireLoss(-2*REM, FALSE)
|
||||
M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
|
||||
M.adjustFireLoss(4*REM, FALSE)
|
||||
M.adjustFireLoss(4*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1217,14 +1217,14 @@
|
||||
pH = 10
|
||||
|
||||
/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(-2*REM, FALSE)
|
||||
M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
|
||||
M.reagents.remove_reagent(R.type,1)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
|
||||
M.adjustToxLoss(4*REM, FALSE) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
|
||||
M.adjustToxLoss(4*REAGENTS_EFFECT_MULTIPLIER, FALSE) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1255,18 +1255,18 @@
|
||||
|
||||
/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(80))
|
||||
M.adjustBruteLoss(-1*REM, FALSE)
|
||||
M.adjustFireLoss(-1*REM, FALSE)
|
||||
M.adjustOxyLoss(-1*REM, FALSE)
|
||||
M.adjustToxLoss(-1*REM, FALSE)
|
||||
M.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M)
|
||||
M.adjustToxLoss(2*REM, FALSE)
|
||||
M.adjustOxyLoss(2*REM, FALSE)
|
||||
M.adjustBruteLoss(2*REM, FALSE)
|
||||
M.adjustFireLoss(2*REM, FALSE)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1279,10 +1279,10 @@
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-1.5*REM, FALSE)
|
||||
M.adjustFireLoss(-1.5*REM, FALSE)
|
||||
M.adjustOxyLoss(-1.5*REM, FALSE)
|
||||
M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
M.adjustBruteLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, 0, TRUE) //heals TOXINLOVERs
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -1295,13 +1295,13 @@
|
||||
value = REAGENT_VALUE_EXCEPTIONAL
|
||||
|
||||
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-5*REM, FALSE) //A ton of healing - this is a 50 telecrystal investment.
|
||||
M.adjustFireLoss(-5*REM, FALSE)
|
||||
M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE) //A ton of healing - this is a 50 telecrystal investment.
|
||||
M.adjustFireLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(-15, FALSE)
|
||||
M.adjustToxLoss(-5*REM, FALSE)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
|
||||
M.adjustCloneLoss(-3*REM, FALSE)
|
||||
M.adjustStaminaLoss(-25*REM,FALSE)
|
||||
M.adjustToxLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustCloneLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustStaminaLoss(-25*REAGENTS_EFFECT_MULTIPLIER,FALSE)
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.adjust_integration_blood(40) // blood fall out man bad
|
||||
..()
|
||||
@@ -1316,13 +1316,13 @@
|
||||
value = REAGENT_VALUE_VERY_RARE
|
||||
|
||||
/datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-2*REM, FALSE)
|
||||
M.adjustFireLoss(-2*REM, FALSE)
|
||||
M.adjustOxyLoss(-5*REM, FALSE)
|
||||
M.adjustToxLoss(-2*REM, FALSE)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5*REM)
|
||||
M.adjustCloneLoss(-1.25*REM, FALSE)
|
||||
M.adjustStaminaLoss(-4*REM,FALSE)
|
||||
M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
M.adjustCloneLoss(-1.25*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustStaminaLoss(-4*REAGENTS_EFFECT_MULTIPLIER,FALSE)
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.adjust_integration_blood(3)
|
||||
..()
|
||||
@@ -1340,17 +1340,17 @@
|
||||
value = REAGENT_VALUE_UNCOMMON
|
||||
|
||||
/datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-1.5*REM, FALSE)
|
||||
M.adjustFireLoss(-1.5*REM, FALSE)
|
||||
M.adjustOxyLoss(-1.5*REM, FALSE)
|
||||
M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
M.adjustBruteLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(-1.5*REAGENTS_EFFECT_MULTIPLIER, 0, TRUE) //heals TOXINLOVERs
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/neo_jelly/overdose_process(mob/living/M)
|
||||
M.adjustOxyLoss(2.6*REM, FALSE)
|
||||
M.adjustBruteLoss(3.5*REM, FALSE)
|
||||
M.adjustFireLoss(3.5*REM, FALSE)
|
||||
M.adjustOxyLoss(2.6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustBruteLoss(3.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(3.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1378,13 +1378,13 @@
|
||||
myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.5))
|
||||
|
||||
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-3 * REM, FALSE)
|
||||
M.adjustFireLoss(-3 * REM, FALSE)
|
||||
M.adjustOxyLoss(-15 * REM, FALSE)
|
||||
M.adjustToxLoss(-3 * REM, FALSE, TRUE) //Heals TOXINLOVERS
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
|
||||
M.adjustCloneLoss(-1 * REM, FALSE)
|
||||
M.adjustStaminaLoss(-13 * REM, FALSE)
|
||||
M.adjustBruteLoss(-3 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustFireLoss(-3 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustOxyLoss(-15 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustToxLoss(-3 * REAGENTS_EFFECT_MULTIPLIER, FALSE, TRUE) //Heals TOXINLOVERS
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REAGENTS_EFFECT_MULTIPLIER, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
|
||||
M.adjustCloneLoss(-1 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.adjustStaminaLoss(-13 * REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
|
||||
M.druggy = min(max(0, M.druggy + 10), 15) //See above
|
||||
..()
|
||||
@@ -1392,7 +1392,7 @@
|
||||
|
||||
/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
|
||||
M.hallucination = min(max(0, M.hallucination + 5), 60)
|
||||
M.adjustToxLoss(8 * REM, FALSE, TRUE) //Hurts TOXINLOVERS
|
||||
M.adjustToxLoss(8 * REAGENTS_EFFECT_MULTIPLIER, FALSE, TRUE) //Hurts TOXINLOVERS
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1414,8 +1414,8 @@
|
||||
if (M.hallucination >= 5)
|
||||
M.hallucination -= 5
|
||||
if(prob(20))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 50)
|
||||
M.adjustStaminaLoss(2.5*REM, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REAGENTS_EFFECT_MULTIPLIER, 50)
|
||||
M.adjustStaminaLoss(2.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -1434,9 +1434,9 @@
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M)
|
||||
M.adjustBruteLoss(3*REM, 0)
|
||||
M.adjustFireLoss(3*REM, 0)
|
||||
M.adjustToxLoss(3*REM, 0)
|
||||
M.adjustBruteLoss(3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustFireLoss(3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -1450,10 +1450,10 @@
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired)
|
||||
..()
|
||||
metabolizer.AdjustAllImmobility(-20 * REM * delta_time)
|
||||
metabolizer.adjustStaminaLoss(-30 * REM * delta_time, 0)
|
||||
metabolizer.Jitter(10 * REM * delta_time)
|
||||
metabolizer.Dizzy(10 * REM * delta_time)
|
||||
metabolizer.AdjustAllImmobility(-20 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
metabolizer.adjustStaminaLoss(-30 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0)
|
||||
metabolizer.Jitter(10 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
metabolizer.Dizzy(10 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
|
||||
@@ -1471,7 +1471,7 @@
|
||||
L.Jitter(0)
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, delta_time, times_fired)
|
||||
metabolizer.adjustToxLoss(1 * REM * delta_time, 0)
|
||||
metabolizer.adjustToxLoss(1 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -1546,7 +1546,7 @@
|
||||
overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun
|
||||
M.AdjustAllImmobility(-5, 0)
|
||||
M.AdjustUnconscious(-5, 0)
|
||||
M.adjustStaminaLoss(-1*REM, 0)
|
||||
M.adjustStaminaLoss(-1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.Jitter(1)
|
||||
metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick
|
||||
. = TRUE
|
||||
@@ -1566,8 +1566,8 @@
|
||||
if(prob(50))
|
||||
M.losebreath++
|
||||
if(41 to 80)
|
||||
M.adjustOxyLoss(0.1*REM, 0)
|
||||
M.adjustStaminaLoss(0.1*REM, 0)
|
||||
M.adjustOxyLoss(0.1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustStaminaLoss(0.1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.jitteriness = min(M.jitteriness+1, 20)
|
||||
M.stuttering = min(M.stuttering+1, 20)
|
||||
M.Dizzy(10)
|
||||
@@ -1579,12 +1579,12 @@
|
||||
M.DefaultCombatKnockdown(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used
|
||||
if(81)
|
||||
to_chat(M, "You feel too exhausted to continue!") // at this point you will eventually die unless you get charcoal
|
||||
M.adjustOxyLoss(0.1*REM, 0)
|
||||
M.adjustStaminaLoss(0.1*REM, 0)
|
||||
M.adjustOxyLoss(0.1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustStaminaLoss(0.1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(82 to INFINITY)
|
||||
M.Sleeping(100, 0, TRUE)
|
||||
M.adjustOxyLoss(1.5*REM, 0)
|
||||
M.adjustStaminaLoss(1.5*REM, 0)
|
||||
M.adjustOxyLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustStaminaLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -1674,7 +1674,7 @@
|
||||
value = REAGENT_VALUE_UNCOMMON // while it's 'rare', it can be milked from the wisdom cow
|
||||
|
||||
/datum/reagent/medicine/liquid_wisdom/on_mob_life(mob/living/carbon/C) //slightly stronger mannitol, from the wisdom cow
|
||||
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM)
|
||||
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REAGENTS_EFFECT_MULTIPLIER)
|
||||
if(prob(20))
|
||||
C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
|
||||
if(prob(3))
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
var/blood_id = C.get_blood_id()
|
||||
if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW))
|
||||
if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
|
||||
C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
|
||||
C.adjustToxLoss(rand(2,8)*REAGENTS_EFFECT_MULTIPLIER, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
|
||||
..()
|
||||
|
||||
/datum/reagent/blood/reaction_obj(obj/O, volume)
|
||||
@@ -175,10 +175,10 @@
|
||||
if(prob(10))
|
||||
if(M.dna?.species?.exotic_bloodtype != "GEL")
|
||||
to_chat(M, "<span class='danger'>Your insides are burning!</span>")
|
||||
M.adjustToxLoss(rand(20,60)*REM, 0)
|
||||
M.adjustToxLoss(rand(20,60)*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
else if(prob(40) && isjellyperson(M))
|
||||
M.heal_bodypart_damage(2*REM)
|
||||
M.heal_bodypart_damage(2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -1019,7 +1019,7 @@
|
||||
mytray.adjustWeeds(-rand(1,3))
|
||||
|
||||
/datum/reagent/chlorine/on_mob_life(mob/living/carbon/M)
|
||||
M.take_bodypart_damage(1*REM, 0, 0, 0)
|
||||
M.take_bodypart_damage(1*REAGENTS_EFFECT_MULTIPLIER, 0, 0, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -1041,7 +1041,7 @@
|
||||
mytray.adjustWeeds(-rand(1,4))
|
||||
|
||||
/datum/reagent/fluorine/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -1098,7 +1098,7 @@
|
||||
mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 1))
|
||||
|
||||
/datum/reagent/radium/on_mob_life(mob/living/carbon/M)
|
||||
M.apply_effect(2*REM/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
|
||||
M.apply_effect(2*REAGENTS_EFFECT_MULTIPLIER/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
|
||||
..()
|
||||
|
||||
/datum/reagent/radium/reaction_turf(turf/T, reac_volume)
|
||||
@@ -1398,7 +1398,7 @@
|
||||
/datum/reagent/impedrezene/on_mob_life(mob/living/carbon/M)
|
||||
M.jitteriness = max(M.jitteriness-5,0)
|
||||
if(prob(80))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
if(prob(50))
|
||||
M.drowsyness = max(M.drowsyness, 3)
|
||||
if(prob(10))
|
||||
@@ -1574,7 +1574,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/stimulum/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustStaminaLoss(-2*REM, 0)
|
||||
M.adjustStaminaLoss(-2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
current_cycle++
|
||||
holder.remove_reagent(type, 0.99) //Gives time for the next tick of life().
|
||||
. = TRUE //Update status effects.
|
||||
@@ -1687,7 +1687,7 @@
|
||||
|
||||
/datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(tox_prob))
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -2533,7 +2533,7 @@
|
||||
var/obj/item/bodypart/wounded_part = W.limb
|
||||
if(wounded_part)
|
||||
wounded_part.heal_damage(0.25, 0.25)
|
||||
M.adjustStaminaLoss(-0.25*REM) // the more wounds, the more stamina regen
|
||||
M.adjustStaminaLoss(-0.25*REAGENTS_EFFECT_MULTIPLIER) // the more wounds, the more stamina regen
|
||||
..()
|
||||
|
||||
/datum/reagent/eldritch
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/datum/reagent/toxin/on_mob_life(mob/living/carbon/M)
|
||||
if(toxpwr)
|
||||
M.adjustToxLoss(toxpwr*REM, 0)
|
||||
M.adjustToxLoss(toxpwr*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = TRUE
|
||||
..()
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
|
||||
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
|
||||
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
|
||||
holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2*REM)
|
||||
holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2*REAGENTS_EFFECT_MULTIPLIER)
|
||||
C.adjustPlasma(20)
|
||||
return ..()
|
||||
|
||||
@@ -136,10 +136,10 @@
|
||||
/datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(10))
|
||||
to_chat(M, "<span class='danger'>Your insides are burning!</span>")
|
||||
M.adjustToxLoss(rand(20,60)*REM, 0)
|
||||
M.adjustToxLoss(rand(20,60)*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
else if(prob(40))
|
||||
M.heal_bodypart_damage(5*REM)
|
||||
M.heal_bodypart_damage(5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/zombiepowder/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
|
||||
L.adjustOxyLoss(0.5*REM, 0)
|
||||
L.adjustOxyLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(method == INGEST)
|
||||
fakedeath_active = TRUE
|
||||
L.fakedeath(type)
|
||||
@@ -230,7 +230,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOxyLoss(1*REM, 0)
|
||||
M.adjustOxyLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -365,7 +365,7 @@
|
||||
. = 1
|
||||
if(51 to INFINITY)
|
||||
M.Sleeping(40, 0)
|
||||
M.adjustToxLoss((current_cycle - 50)*REM, 0)
|
||||
M.adjustToxLoss((current_cycle - 50)*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -387,7 +387,7 @@
|
||||
M.Sleeping(40, 0)
|
||||
if(51 to INFINITY)
|
||||
M.Sleeping(40, 0)
|
||||
M.adjustToxLoss((current_cycle - 50)*REM, 0)
|
||||
M.adjustToxLoss((current_cycle - 50)*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/toxin/coffeepowder
|
||||
@@ -437,7 +437,7 @@
|
||||
value = REAGENT_VALUE_UNCOMMON
|
||||
|
||||
/datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustStaminaLoss(REM * data, 0)
|
||||
M.adjustStaminaLoss(REAGENTS_EFFECT_MULTIPLIER * data, 0)
|
||||
data = max(data - 1, 5)
|
||||
..()
|
||||
. = 1
|
||||
@@ -478,14 +478,14 @@
|
||||
if(4)
|
||||
if(prob(75))
|
||||
to_chat(M, "You scratch at an itch.")
|
||||
M.adjustBruteLoss(2*REM, 0)
|
||||
M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/histamine/overdose_process(mob/living/M)
|
||||
M.adjustOxyLoss(2*REM, 0)
|
||||
M.adjustBruteLoss(2*REM, 0)
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustOxyLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustBruteLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -515,7 +515,7 @@
|
||||
|
||||
/datum/reagent/toxin/venom/on_mob_life(mob/living/carbon/M)
|
||||
toxpwr = 0.2*volume
|
||||
M.adjustBruteLoss((0.3*volume)*REM, 0)
|
||||
M.adjustBruteLoss((0.3*volume)*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
if(prob(15))
|
||||
M.reagents.add_reagent(/datum/reagent/toxin/histamine, pick(5,10))
|
||||
@@ -532,9 +532,9 @@
|
||||
toxpwr = 0
|
||||
|
||||
/datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REM, 150)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REAGENTS_EFFECT_MULTIPLIER, 150)
|
||||
if(M.toxloss <= 60)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(current_cycle >= 18)
|
||||
M.Sleeping(40, 0)
|
||||
..()
|
||||
@@ -555,7 +555,7 @@
|
||||
if(prob(8))
|
||||
to_chat(M, "You feel horrendously weak!")
|
||||
M.Stun(40, 0)
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/toxin/bad_food
|
||||
@@ -583,15 +583,15 @@
|
||||
/datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(15))
|
||||
to_chat(M, "You scratch at your head.")
|
||||
M.adjustBruteLoss(0.2*REM, 0)
|
||||
M.adjustBruteLoss(0.2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
if(prob(15))
|
||||
to_chat(M, "You scratch at your leg.")
|
||||
M.adjustBruteLoss(0.2*REM, 0)
|
||||
M.adjustBruteLoss(0.2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
if(prob(15))
|
||||
to_chat(M, "You scratch at your arm.")
|
||||
M.adjustBruteLoss(0.2*REM, 0)
|
||||
M.adjustBruteLoss(0.2*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
if(prob(3))
|
||||
M.reagents.add_reagent(/datum/reagent/toxin/histamine,rand(1,3))
|
||||
@@ -660,7 +660,7 @@
|
||||
/datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/M)
|
||||
if(current_cycle >= 10)
|
||||
M.Sleeping(40, 0)
|
||||
M.adjustStaminaLoss(10*REM, 0)
|
||||
M.adjustStaminaLoss(10*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
@@ -687,7 +687,7 @@
|
||||
value = REAGENT_VALUE_RARE
|
||||
|
||||
/datum/reagent/toxin/amanitin/on_mob_end_metabolize(mob/living/M)
|
||||
var/toxdamage = current_cycle*3*REM
|
||||
var/toxdamage = current_cycle*3*REAGENTS_EFFECT_MULTIPLIER
|
||||
M.log_message("has taken [toxdamage] toxin damage from amanitin toxin", LOG_ATTACK)
|
||||
M.adjustToxLoss(toxdamage)
|
||||
..()
|
||||
@@ -703,7 +703,7 @@
|
||||
|
||||
/datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/M)
|
||||
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
M.adjust_nutrition(-3) // making the chef more valuable, one meme trap at a time
|
||||
M.overeatduration = 0
|
||||
return ..()
|
||||
@@ -759,7 +759,7 @@
|
||||
/datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M)
|
||||
if(current_cycle >= 11)
|
||||
M.DefaultCombatKnockdown(60, 0)
|
||||
M.adjustOxyLoss(1*REM, 0)
|
||||
M.adjustOxyLoss(1*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -942,7 +942,7 @@
|
||||
/datum/reagent/toxin/delayed/on_mob_life(mob/living/carbon/M)
|
||||
if(current_cycle > delay)
|
||||
holder.remove_reagent(type, actual_metaboliztion_rate * M.metabolism_efficiency)
|
||||
M.adjustToxLoss(actual_toxpwr*REM, 0)
|
||||
M.adjustToxLoss(actual_toxpwr*REAGENTS_EFFECT_MULTIPLIER, 0)
|
||||
if(prob(10))
|
||||
M.DefaultCombatKnockdown(20, 0)
|
||||
. = 1
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
SplashReagents(user)
|
||||
return
|
||||
else
|
||||
DISABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, DRAWABLE |INJECTABLE )
|
||||
reagents.reagents_holder_flags &= ~(OPENCONTAINER)
|
||||
reagents.reagents_holder_flags |= (DRAWABLE|INJECTABLE)
|
||||
spillable = FALSE
|
||||
sealed = TRUE
|
||||
to_chat(user, "<span class='notice'>You seal the bag.</span>")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user