Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into supernova
This commit is contained in:
@@ -413,10 +413,6 @@
|
||||
/obj/item/toy/figure/chef,
|
||||
/turf/open/floor/wood,
|
||||
/area/awaymission/jungleresort)
|
||||
"gC" = (
|
||||
/obj/item/clothing/head/rice_hat/cursed,
|
||||
/turf/open/floor/plating/dirt/jungle,
|
||||
/area/awaymission/jungleresort)
|
||||
"gK" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted,
|
||||
@@ -13828,7 +13824,7 @@ io
|
||||
du
|
||||
YF
|
||||
io
|
||||
gC
|
||||
io
|
||||
io
|
||||
io
|
||||
ia
|
||||
@@ -26666,4 +26662,3 @@ bG
|
||||
bG
|
||||
bG
|
||||
"}
|
||||
|
||||
|
||||
@@ -22,3 +22,5 @@
|
||||
#define POLICYCONFIG_ON_DEFIB_LATE "ON_DEFIB_LATE"
|
||||
/// Displayed to pyroclastic slimes on spawn
|
||||
#define POLICYCONFIG_ON_PYROCLASTIC_SENTIENT "PYROCLASTIC_SLIME"
|
||||
/// Displayed to pAIs on spawn
|
||||
#define POLICYCONFIG_PAI "PAI_SPAWN"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#define INSTRUMENT_EXP_FALLOFF_MAX 10
|
||||
|
||||
/// Minimum volume for when the sound is considered dead.
|
||||
#define INSTRUMENT_MIN_SUSTAIN_DROPOFF 0
|
||||
#define INSTRUMENT_MIN_SUSTAIN_DROPOFF 1
|
||||
|
||||
#define SUSTAIN_LINEAR 1
|
||||
#define SUSTAIN_EXPONENTIAL 2
|
||||
|
||||
@@ -86,8 +86,8 @@
|
||||
#define EMOTE_OMNI 4
|
||||
|
||||
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
|
||||
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
|
||||
#define MAX_FLAVOR_LEN 4096 //double the maximum message length.
|
||||
#define MAX_MESSAGE_LEN 4096 //Citadel edit: What's the WORST that could happen?
|
||||
#define MAX_FLAVOR_LEN 4096
|
||||
#define MAX_TASTE_LEN 40 //lick... vore... ew...
|
||||
#define MAX_NAME_LEN 42
|
||||
#define MAX_BROADCAST_LEN 512
|
||||
|
||||
@@ -242,6 +242,8 @@
|
||||
SSpersistence.station_was_destroyed = TRUE
|
||||
if(!mode.allow_persistence_save)
|
||||
SSpersistence.station_persistence_save_disabled = TRUE
|
||||
else
|
||||
SSpersistence.SaveTCGCards()
|
||||
SSpersistence.CollectData()
|
||||
|
||||
//stop collecting feedback during grifftime
|
||||
|
||||
@@ -132,6 +132,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_NODROP" = TRAIT_NODROP,
|
||||
"TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT,
|
||||
"TRAIT_SPOOKY_THROW" = TRAIT_SPOOKY_THROW
|
||||
),
|
||||
/datum/mind = list(
|
||||
"TRAIT_CLOWN_MENTALITY" = TRAIT_CLOWN_MENTALITY
|
||||
)
|
||||
))
|
||||
|
||||
|
||||
@@ -496,9 +496,15 @@ SUBSYSTEM_DEF(job)
|
||||
H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)
|
||||
for(var/card_type in H.client.prefs.tcg_cards)
|
||||
if(card_type)
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, H.client.prefs.tcg_cards[card_type])
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
if(islist(H.client.prefs.tcg_cards[card_type]))
|
||||
for(var/duplicate in H.client.prefs.tcg_cards[card_type])
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, duplicate)
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
else
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, H.client.prefs.tcg_cards[card_type])
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
binder.check_for_exodia()
|
||||
if(length(H.client.prefs.tcg_decks))
|
||||
binder.decks = H.client.prefs.tcg_decks
|
||||
@@ -508,9 +514,15 @@ SUBSYSTEM_DEF(job)
|
||||
H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)
|
||||
for(var/card_type in N.client.prefs.tcg_cards)
|
||||
if(card_type)
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, N.client.prefs.tcg_cards[card_type])
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
if(islist(H.client.prefs.tcg_cards[card_type]))
|
||||
for(var/duplicate in N.client.prefs.tcg_cards[card_type])
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, duplicate)
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
else
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, N.client.prefs.tcg_cards[card_type])
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
binder.check_for_exodia()
|
||||
if(length(N.client.prefs.tcg_decks))
|
||||
binder.decks = N.client.prefs.tcg_decks
|
||||
|
||||
@@ -88,7 +88,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
SavePaintings()
|
||||
SaveScars()
|
||||
SaveTCGCards()
|
||||
|
||||
/**
|
||||
* Loads persistent data relevant to the current map: Objects, etc.
|
||||
|
||||
@@ -44,7 +44,8 @@
|
||||
icon_state = "colormate"
|
||||
|
||||
/obj/machinery/gear_painter/Destroy()
|
||||
inserted.forceMove(drop_location())
|
||||
if(inserted) //please i beg you do not drop nulls
|
||||
inserted.forceMove(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gear_painter/attackby(obj/item/I, mob/living/user)
|
||||
|
||||
@@ -117,12 +117,6 @@
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
//callback proc used on stacks use_tool to stop unnecessary amounts being wasted from spam clicking.
|
||||
/obj/structure/frame/computer/proc/check_state(target_state)
|
||||
if(state == target_state)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/frame/computer/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(state == 4)
|
||||
|
||||
@@ -21,6 +21,11 @@
|
||||
circuit = null
|
||||
qdel(src)
|
||||
|
||||
//callback proc used on stacks use_tool to stop unnecessary amounts being wasted from spam clicking.
|
||||
/obj/structure/frame/proc/check_state(target_state)
|
||||
if(state == target_state)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/frame/machine
|
||||
name = "machine frame"
|
||||
@@ -84,7 +89,7 @@
|
||||
if(!P.tool_start_check(user, amount=5))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start to add cables to the frame...</span>")
|
||||
if(P.use_tool(src, user, 20, volume=50, amount=5))
|
||||
if(P.use_tool(src, user, 20, volume=50, amount=5, extra_checks = CALLBACK(src, .proc/check_state, 1)))
|
||||
to_chat(user, "<span class='notice'>You add cables to the frame.</span>")
|
||||
state = 2
|
||||
icon_state = "box_1"
|
||||
@@ -93,25 +98,23 @@
|
||||
if(P.tool_behaviour == TOOL_SCREWDRIVER && !anchored)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the frame.</span>", \
|
||||
"<span class='notice'>You start to disassemble the frame...</span>", "You hear banging and clanking.")
|
||||
if(P.use_tool(src, user, 40, volume=50))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You disassemble the frame.</span>")
|
||||
var/obj/item/stack/sheet/metal/M = new (loc, 5)
|
||||
M.add_fingerprint(user)
|
||||
qdel(src)
|
||||
if(P.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, .proc/check_state, 1)))
|
||||
to_chat(user, "<span class='notice'>You disassemble the frame.</span>")
|
||||
var/obj/item/stack/sheet/metal/M = new (loc, 5)
|
||||
M.add_fingerprint(user)
|
||||
qdel(src)
|
||||
return
|
||||
if(P.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(P.use_tool(src, user, 40, volume=75))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
setAnchored(!anchored)
|
||||
if(P.use_tool(src, user, 40, volume=75, extra_checks = CALLBACK(src, .proc/check_state, 1)))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
setAnchored(!anchored)
|
||||
return
|
||||
|
||||
if(2)
|
||||
if(P.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(P.use_tool(src, user, 40, volume=75))
|
||||
if(P.use_tool(src, user, 40, volume=75, extra_checks = CALLBACK(src, .proc/check_state, 2)))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
setAnchored(!anchored)
|
||||
return
|
||||
@@ -169,7 +172,7 @@
|
||||
|
||||
if(P.tool_behaviour == TOOL_WRENCH && !circuit.needs_anchored)
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(P.use_tool(src, user, 40, volume=75))
|
||||
if(P.use_tool(src, user, 40, volume=75, extra_checks = CALLBACK(src, .proc/check_state, 3)))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
setAnchored(!anchored)
|
||||
return
|
||||
|
||||
@@ -122,7 +122,10 @@
|
||||
/obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
|
||||
src.pai = personality
|
||||
src.add_overlay("pai-null")
|
||||
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/policy = policies[POLICYCONFIG_PAI]
|
||||
if(policy)
|
||||
to_chat(personality, policy)
|
||||
playsound(loc, 'sound/effects/pai_boot.ogg', 50, 1, -1)
|
||||
audible_message("\The [src] plays a cheerful startup noise!")
|
||||
|
||||
|
||||
@@ -771,7 +771,10 @@
|
||||
|
||||
/obj/item/nullrod/tribal_knife/process()
|
||||
slowdown = rand(-2, 2)
|
||||
|
||||
if(iscarbon(loc))
|
||||
var/mob/living/carbon/wielder = loc
|
||||
if(wielder.is_holding(src))
|
||||
wielder.update_equipment_speed_mods()
|
||||
|
||||
/obj/item/nullrod/pitchfork
|
||||
icon_state = "pitchfork0"
|
||||
|
||||
@@ -433,31 +433,21 @@
|
||||
destroy_objective.find_target()
|
||||
objectives += destroy_objective
|
||||
else
|
||||
if(prob(70))
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = owner
|
||||
if(team_mode) //No backstabbing while in a team
|
||||
kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
|
||||
else
|
||||
kill_objective.find_target()
|
||||
objectives += kill_objective
|
||||
|
||||
/*else
|
||||
var/datum/objective/maroon/maroon_objective = new
|
||||
maroon_objective.owner = owner
|
||||
if(team_mode)
|
||||
maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
|
||||
else
|
||||
maroon_objective.find_target()
|
||||
objectives += maroon_objective*/
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = owner
|
||||
if(team_mode) //No backstabbing while in a team
|
||||
kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
|
||||
else
|
||||
kill_objective.find_target()
|
||||
objectives += kill_objective
|
||||
|
||||
if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible)
|
||||
var/datum/objective/escape/escape_with_identity/identity_theft = new
|
||||
identity_theft.owner = owner
|
||||
identity_theft.target = kill_objective.target
|
||||
identity_theft.update_explanation_text()
|
||||
objectives += identity_theft
|
||||
escape_objective_possible = FALSE
|
||||
if(!(locate(/datum/objective/escape) in objectives) && escape_objective_possible && prob(50))
|
||||
var/datum/objective/escape/escape_with_identity/identity_theft = new
|
||||
identity_theft.owner = owner
|
||||
identity_theft.target = kill_objective.target
|
||||
identity_theft.update_explanation_text()
|
||||
objectives += identity_theft
|
||||
escape_objective_possible = FALSE
|
||||
|
||||
if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible)
|
||||
if(prob(50))
|
||||
|
||||
@@ -191,8 +191,6 @@ new /datum/disease_ability/symptom/powerful/youth
|
||||
/datum/disease_ability/action/sneeze
|
||||
name = "Voluntary Sneezing"
|
||||
actions = list(/datum/action/cooldown/disease_sneeze)
|
||||
cost = 2
|
||||
required_total_points = 3
|
||||
short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them."
|
||||
long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.<br>Cooldown: 20 seconds"
|
||||
|
||||
@@ -229,8 +227,6 @@ new /datum/disease_ability/symptom/powerful/youth
|
||||
/datum/disease_ability/action/infect
|
||||
name = "Secrete Infection"
|
||||
actions = list(/datum/action/cooldown/disease_infect)
|
||||
cost = 2
|
||||
required_total_points = 3
|
||||
short_desc = "Cause all objects your host is touching to become infectious for a limited time, spreading your infection to anyone who touches them."
|
||||
long_desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds. This includes the floor, if they are not wearing shoes, and any items they are holding, if they are not wearing gloves.<br>Cooldown: 40 seconds"
|
||||
|
||||
@@ -271,23 +267,20 @@ new /datum/disease_ability/symptom/powerful/youth
|
||||
//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
|
||||
|
||||
/datum/disease_ability/symptom/mild
|
||||
cost = 2
|
||||
required_total_points = 4
|
||||
category = "Symptom (Weak)"
|
||||
|
||||
/datum/disease_ability/symptom/medium
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
category = "Symptom"
|
||||
|
||||
/datum/disease_ability/symptom/medium/heal
|
||||
cost = 5
|
||||
required_total_points = 5
|
||||
malefit = -1
|
||||
category = "Symptom (+)"
|
||||
|
||||
/datum/disease_ability/symptom/powerful
|
||||
cost = 4
|
||||
required_total_points = 16
|
||||
required_total_points = 10
|
||||
category = "Symptom (Strong)"
|
||||
|
||||
/datum/disease_ability/symptom/powerful/heal
|
||||
|
||||
@@ -566,7 +566,7 @@
|
||||
human_user.adjustBruteLoss(-10, FALSE)
|
||||
human_user.adjustFireLoss(-10, FALSE)
|
||||
human_user.adjustStaminaLoss(-10, FALSE)
|
||||
human_user.adjustToxLoss(-10, FALSE)
|
||||
human_user.adjustToxLoss(-10, FALSE, TRUE)
|
||||
human_user.adjustOxyLoss(-10)
|
||||
|
||||
/obj/effect/proc_holder/spell/pointed/manse_link
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
human_user.adjustBruteLoss(-6, FALSE)
|
||||
human_user.adjustFireLoss(-6, FALSE)
|
||||
human_user.adjustToxLoss(-6, FALSE)
|
||||
human_user.adjustToxLoss(-6, FALSE, TRUE)
|
||||
human_user.adjustOxyLoss(-6, FALSE)
|
||||
human_user.adjustStaminaLoss(-20)
|
||||
|
||||
|
||||
@@ -12,11 +12,10 @@
|
||||
mode = SSticker.mode
|
||||
assassin_prob = max(0,mode.threat_level-40)
|
||||
if(prob(assassin_prob))
|
||||
if(prob(assassin_prob))
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = T.owner
|
||||
kill_objective.find_target()
|
||||
T.add_objective(kill_objective)
|
||||
var/datum/objective/assassinate/once/kill_objective = new
|
||||
kill_objective.owner = T.owner
|
||||
kill_objective.find_target()
|
||||
T.add_objective(kill_objective)
|
||||
else
|
||||
var/list/weights = list()
|
||||
weights["sabo"] = length(subtypesof(/datum/sabotage_objective))
|
||||
|
||||
@@ -256,6 +256,8 @@
|
||||
|
||||
/datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder)
|
||||
var/turf/open/location
|
||||
if (isopenturf(holder))
|
||||
return
|
||||
if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet.
|
||||
var/datum/pipeline/fusion_pipenet = holder
|
||||
location = get_turf(pick(fusion_pipenet.members))
|
||||
|
||||
@@ -13,7 +13,7 @@ GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f")
|
||||
if(!mob)
|
||||
return
|
||||
|
||||
if(!(prefs.toggles & CHAT_OOC))
|
||||
if(!(prefs.chat_toggles & CHAT_OOC))
|
||||
to_chat(src, "<span class='danger'> You have OOC muted.</span>")
|
||||
return
|
||||
if(jobban_isbanned(mob, "OOC"))
|
||||
|
||||
@@ -220,8 +220,8 @@
|
||||
parry_max_attacks = INFINITY
|
||||
parry_failed_cooldown_duration = 2.25 SECONDS
|
||||
parry_failed_stagger_duration = 2.25 SECONDS
|
||||
parry_cooldown = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 0.5 SECONDS
|
||||
parry_cooldown = 0
|
||||
parry_failed_clickcd_duration = 0
|
||||
|
||||
/obj/item/clothing/gloves/botanic_leather
|
||||
name = "botanist's leather gloves"
|
||||
|
||||
@@ -1040,6 +1040,12 @@
|
||||
icon_state = "wbreakpoly"
|
||||
item_state = "wbreakpoly"
|
||||
|
||||
/obj/item/clothing/suit/toggle/wbreakpoly/on_toggle(mob/user)
|
||||
if(suittoggled)
|
||||
to_chat(usr, "<span class='notice'>You zip up [src].</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You unzip [src].</span>")
|
||||
|
||||
/obj/item/clothing/suit/toggle/wbreakpoly/polychromic/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/polychromic, list("#464F65", "#916035", "#474747"), 3)
|
||||
|
||||
@@ -110,6 +110,9 @@
|
||||
suit_toggle(user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/suit/toggle/proc/on_toggle(mob/user) // override this, not suit_toggle, which does checks
|
||||
to_chat(usr, "<span class='notice'>You toggle [src]'s [togglename].</span>")
|
||||
|
||||
/obj/item/clothing/suit/toggle/ui_action_click()
|
||||
suit_toggle()
|
||||
|
||||
@@ -119,7 +122,7 @@
|
||||
if(!can_use(usr))
|
||||
return 0
|
||||
|
||||
to_chat(usr, "<span class='notice'>You toggle [src]'s [togglename].</span>")
|
||||
on_toggle(usr)
|
||||
if(src.suittoggled)
|
||||
src.icon_state = "[initial(icon_state)]"
|
||||
src.suittoggled = FALSE
|
||||
|
||||
@@ -138,3 +138,27 @@
|
||||
icon_state = "greyturtle"
|
||||
item_state = "greyturtle"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/suit/turtle/purple
|
||||
name = "purple turtleneck"
|
||||
icon_state = "turtle_sci"
|
||||
item_state = "turtle_sci"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/suit/turtle/orange
|
||||
name = "orange turtleneck"
|
||||
icon_state = "turtle_eng"
|
||||
item_state = "turtle_eng"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/suit/turtle/red
|
||||
name = "red turtleneck"
|
||||
icon_state = "turtle_sec"
|
||||
item_state = "turtle_sec"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/suit/turtle/blue
|
||||
name = "blue turtleneck"
|
||||
icon_state = "turtle_med"
|
||||
item_state = "turtle_med"
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -21,27 +21,6 @@
|
||||
new /obj/item/reagent_containers/food/snacks/candyheart(B)
|
||||
new /obj/item/storage/fancy/heart_box(B)
|
||||
|
||||
var/list/valentines = list()
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
if(!M.stat && M.client && M.mind && !HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
|
||||
valentines |= M
|
||||
|
||||
|
||||
while(valentines.len)
|
||||
var/mob/living/L = pick_n_take(valentines)
|
||||
if(valentines.len)
|
||||
var/mob/living/date = pick_n_take(valentines)
|
||||
|
||||
|
||||
forge_valentines_objective(L, date)
|
||||
forge_valentines_objective(date, L)
|
||||
|
||||
if(valentines.len && prob(4))
|
||||
var/mob/living/notgoodenough = pick_n_take(valentines)
|
||||
forge_valentines_objective(notgoodenough, date)
|
||||
else
|
||||
L.mind.add_antag_datum(/datum/antagonist/heartbreaker)
|
||||
|
||||
/proc/forge_valentines_objective(mob/living/lover,mob/living/date,var/chemLove = FALSE)
|
||||
lover.mind.special_role = "valentine"
|
||||
if (chemLove == TRUE)
|
||||
|
||||
23
code/modules/events/supermatter_surge.dm
Normal file
23
code/modules/events/supermatter_surge.dm
Normal file
@@ -0,0 +1,23 @@
|
||||
/datum/round_event_control/supermatter_surge
|
||||
name = "Supermatter Surge"
|
||||
typepath = /datum/round_event/supermatter_surge
|
||||
weight = 20
|
||||
max_occurrences = 4
|
||||
earliest_start = 10 MINUTES
|
||||
|
||||
/datum/round_event_control/supermatter_surge/canSpawnEvent()
|
||||
if(GLOB.main_supermatter_engine?.has_been_powered)
|
||||
return ..()
|
||||
|
||||
/datum/round_event/supermatter_surge
|
||||
var/power = 2000
|
||||
|
||||
/datum/round_event/supermatter_surge/setup()
|
||||
power = rand(200,4000)
|
||||
|
||||
/datum/round_event/supermatter_surge/announce()
|
||||
if(power > 800 || prob(round(power/8)))
|
||||
priority_announce("Class [round(power/500) + 1] supermatter surge detected. Intervention may be required.", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/supermatter_surge/start()
|
||||
GLOB.main_supermatter_engine.matter_power += power
|
||||
@@ -97,6 +97,7 @@
|
||||
if(myseed.mutatelist.len > 0)
|
||||
myseed.instability = (myseed.instability/2)
|
||||
mutatespecie()
|
||||
return BULLET_ACT_HIT
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -142,10 +142,10 @@
|
||||
parry_efficiency_considered_successful = 0.01
|
||||
parry_efficiency_to_counterattack = 0.01
|
||||
parry_max_attacks = INFINITY
|
||||
parry_failed_cooldown_duration = 3 SECONDS
|
||||
parry_failed_stagger_duration = 2 SECONDS
|
||||
parry_cooldown = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 0.8 SECONDS
|
||||
parry_failed_cooldown_duration = 1.5 SECONDS
|
||||
parry_failed_stagger_duration = 1 SECONDS
|
||||
parry_cooldown = 0
|
||||
parry_failed_clickcd_duration = 0.8
|
||||
|
||||
parry_data = list( // yeah it's snowflake
|
||||
"UNARMED_PARRY_STAGGER" = 3 SECONDS,
|
||||
|
||||
@@ -80,6 +80,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
var/list/inherent_traits = list()
|
||||
var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
|
||||
var/list/blacklisted_quirks = list() // Quirks that will be removed upon gaining this species, to be defined by species
|
||||
var/list/removed_quirks = list() // Quirks that got removed due to being blacklisted, and will be restored when on_species_loss() is called
|
||||
|
||||
var/attack_verb = "punch" // punch-specific attack verb
|
||||
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
|
||||
var/sound/miss_sound = 'sound/weapons/punchmiss.ogg'
|
||||
@@ -342,6 +345,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
for(var/X in inherent_traits)
|
||||
ADD_TRAIT(C, X, SPECIES_TRAIT)
|
||||
|
||||
//lets remove those conflicting quirks
|
||||
remove_blacklisted_quirks(C)
|
||||
|
||||
if(TRAIT_VIRUSIMMUNE in inherent_traits)
|
||||
for(var/datum/disease/A in C.diseases)
|
||||
A.cure(FALSE)
|
||||
@@ -395,6 +401,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
for(var/X in inherent_traits)
|
||||
REMOVE_TRAIT(C, X, SPECIES_TRAIT)
|
||||
|
||||
// lets restore the quirks that got removed when gaining this species
|
||||
restore_quirks(C)
|
||||
|
||||
C.remove_movespeed_modifier(/datum/movespeed_modifier/species)
|
||||
|
||||
if(mutant_bodyparts["meat_type"])
|
||||
@@ -424,6 +433,26 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src)
|
||||
|
||||
// shamelessly inspired by antag_datum.remove_blacklisted_quirks()
|
||||
/datum/species/proc/remove_blacklisted_quirks(mob/living/carbon/C)
|
||||
var/mob/living/L = C.mind?.current
|
||||
if(istype(L))
|
||||
var/list/my_quirks = L.client?.prefs.all_quirks.Copy()
|
||||
SSquirks.filter_quirks(my_quirks, blacklisted_quirks)
|
||||
for(var/q in L.roundstart_quirks)
|
||||
var/datum/quirk/Q = q
|
||||
if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks))
|
||||
L.remove_quirk(Q.type)
|
||||
removed_quirks += Q.type
|
||||
|
||||
// restore any quirks that we removed
|
||||
/datum/species/proc/restore_quirks(mob/living/carbon/C)
|
||||
var/mob/living/L = C.mind?.current
|
||||
if(istype(L))
|
||||
for(var/q in removed_quirks)
|
||||
L.add_quirk(q)
|
||||
|
||||
|
||||
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
|
||||
H.remove_overlay(HAIR_LAYER)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
@@ -1454,9 +1483,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
|
||||
var/armor_block = target.run_armor_check(affecting, "melee")
|
||||
if(HAS_TRAIT(user, TRAIT_MAULER)) // maulers get 15 armorpierce because if you're going to punch someone you might as well do a good job of it
|
||||
armor_block = target.run_armor_check(affecting, "melee", armour_penetration = 15) // lot of good that sec jumpsuit did you
|
||||
|
||||
playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1)
|
||||
target.visible_message("<span class='danger'>[user] [atk_verb]ed [target]!</span>", \
|
||||
"<span class='userdanger'>[user] [atk_verb]ed you!</span>", null, COMBAT_MESSAGE_RANGE, null, \
|
||||
@@ -1473,9 +1499,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
target.apply_damage(damage*1.5, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
target.apply_damage(damage*0.5, STAMINA, affecting, armor_block)
|
||||
log_combat(user, target, "kicked")
|
||||
else if(HAS_TRAIT(user, TRAIT_MAULER)) // mauler punches deal 1.1x raw damage + 1.3x stam damage, and have some armor pierce
|
||||
target.apply_damage(damage*1.1, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
target.apply_damage(damage*1.3, STAMINA, affecting, armor_block)
|
||||
else if(HAS_TRAIT(user, TRAIT_MAULER)) // mauler punches deal 1.2x raw damage but nstam
|
||||
target.apply_damage(damage*1.2, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
log_combat(user, target, "punched (mauler)")
|
||||
else //other attacks deal full raw damage + 2x in stamina damage
|
||||
target.apply_damage(damage, attack_type, affecting, armor_block, wound_bonus = punchwoundbonus)
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
armor = 20 // 120 damage to KO a zombie, which kills it
|
||||
speedmod = 1.6 // they're very slow
|
||||
mutanteyes = /obj/item/organ/eyes/night_vision/zombie
|
||||
blacklisted_quirks = list(/datum/quirk/nonviolent)
|
||||
var/heal_rate = 1
|
||||
var/regen_cooldown = 0
|
||||
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE))
|
||||
to_chat(src, "<span class='warning'>You are not something that can parry attacks.</span>")
|
||||
return
|
||||
if(!(mobility_flags & MOBILITY_STAND))
|
||||
to_chat(src, "<span class='warning'>You aren't able to parry without solid footing!</span>")
|
||||
return
|
||||
// Prioritize item, then martial art, then unarmed.
|
||||
// yanderedev else if time
|
||||
var/obj/item/using_item = get_active_held_item()
|
||||
|
||||
@@ -424,7 +424,7 @@ Difficulty: Very Hard
|
||||
|
||||
/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
|
||||
observer_desc = "This crystal strips and equips its targets as clowns."
|
||||
possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH)
|
||||
possible_methods = list(ACTIVATE_TOUCH) //Because We love AOE transformations!
|
||||
activation_sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
/obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user)
|
||||
|
||||
@@ -398,6 +398,14 @@ Difficulty: Medium
|
||||
crusher_loot = list()
|
||||
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/transformed //ash drake balanced around player control
|
||||
name = "transformed ash drake"
|
||||
desc = "A sentient being transformed into an ash drake"
|
||||
mob_size = MOB_SIZE_HUMAN //prevents crusher vulnerability
|
||||
move_force = MOVE_FORCE_NORMAL //stops them from destroying and unanchoring shit by walking into it
|
||||
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //no we dont want sentient megafauna be able to delete the entire station in a minute flat
|
||||
damage_coeff = list(BRUTE = 0.7, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) //200 health but not locked to standard movespeed, needs armor befitting of a dragon
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
|
||||
return
|
||||
|
||||
@@ -413,7 +421,8 @@ Difficulty: Medium
|
||||
if(L in hit_list || L == source)
|
||||
continue
|
||||
hit_list += L
|
||||
L.adjustFireLoss(20)
|
||||
L.adjustFireLoss(5)
|
||||
L.adjust_fire_stacks(6)
|
||||
to_chat(L, "<span class='userdanger'>You're hit by [source]'s fire breath!</span>")
|
||||
|
||||
// deals damage to mechs
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
A.GiveTarget(target)
|
||||
A.friends = friends
|
||||
A.faction = faction.Copy()
|
||||
if(!A == /mob/living/simple_animal/hostile/poison/bees/toxin)
|
||||
A.my_creator = type
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
|
||||
@@ -88,6 +90,7 @@
|
||||
density = FALSE
|
||||
del_on_death = 1
|
||||
var/swarming = FALSE
|
||||
var/my_creator = null
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize()
|
||||
. = ..()
|
||||
@@ -205,11 +208,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
|
||||
visible_message("<span class='warning'>[name] burrows into the flesh of [H]!</span>")
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
|
||||
if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
|
||||
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
|
||||
else
|
||||
L = new(H.loc)
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = check_infest_type(H)
|
||||
visible_message("<span class='warning'>[L] staggers to [L.p_their()] feet!</span>")
|
||||
H.death()
|
||||
H.adjustBruteLoss(1000)
|
||||
@@ -217,6 +216,20 @@
|
||||
H.forceMove(L)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/check_infest_type(mob/living/carbon/human/human)
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
|
||||
var/list/blacklisted_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf)
|
||||
if(HAS_TRAIT(human, TRAIT_DWARF)) //dwarf legions aren't just fluff!
|
||||
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(human.loc)
|
||||
else if(my_creator)
|
||||
if(my_creator in blacklisted_types)
|
||||
L = new(human.loc)
|
||||
else
|
||||
L = new my_creator(human.loc)
|
||||
else
|
||||
L = new(human.loc)
|
||||
return L
|
||||
|
||||
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
|
||||
stat_attack = DEAD
|
||||
|
||||
@@ -178,10 +178,7 @@
|
||||
|
||||
new /obj/effect/temp_visual/monkeyify/humanify(loc)
|
||||
|
||||
transformation_timer = addtimer(CALLBACK(src, .proc/finish_humanize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
|
||||
|
||||
/mob/living/carbon/proc/finish_humanize(tr_flags)
|
||||
transformation_timer = null
|
||||
sleep(TRANSFORMATION_DURATION) //This entire proc CANNOT be split into two
|
||||
|
||||
var/list/stored_implants = list()
|
||||
var/list/int_organs = list()
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/light_on = FALSE
|
||||
integrity_failure = 0.5
|
||||
max_integrity = 100
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
|
||||
var/enabled = 0 // Whether the computer is turned on.
|
||||
|
||||
@@ -45,6 +45,13 @@
|
||||
trippy = FALSE
|
||||
pH = 8
|
||||
|
||||
//Nicotine is used as a pesticide IRL.
|
||||
/datum/reagent/drug/nicotine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
mytray.adjustToxic(round(chems.get_reagent_amount(type)))
|
||||
mytray.adjustPests(-rand(1,2))
|
||||
|
||||
/datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(1))
|
||||
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
|
||||
|
||||
@@ -49,6 +49,11 @@
|
||||
var/brute_heal = 1
|
||||
var/burn_heal = 0
|
||||
|
||||
/datum/reagent/consumable/nutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
mytray.adjustHealth(round(chems.get_reagent_amount(type) * 0.2))
|
||||
|
||||
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M)
|
||||
if(!HAS_TRAIT(M, TRAIT_NO_PROCESS_FOOD))
|
||||
if(prob(50))
|
||||
|
||||
@@ -155,6 +155,12 @@
|
||||
pH = 11
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
// Healing
|
||||
/datum/reagent/medicine/cryoxadone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
mytray.adjustHealth(round(chems.get_reagent_amount(type) * 3))
|
||||
mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 3))
|
||||
|
||||
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M)
|
||||
var/power = -0.00003 * (M.bodytemperature ** 2) + 3
|
||||
if(M.bodytemperature < T0C)
|
||||
@@ -935,6 +941,12 @@
|
||||
pH = 0
|
||||
value = REAGENT_VALUE_RARE
|
||||
|
||||
// FEED ME SEYMOUR
|
||||
/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
mytray.spawnplant()
|
||||
|
||||
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(M.stat == DEAD)
|
||||
if(M.suiciding || M.hellbound) //they are never coming back
|
||||
|
||||
@@ -2545,7 +2545,7 @@
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustAllImmobility(-40, FALSE)
|
||||
M.adjustStaminaLoss(-15, FALSE)
|
||||
M.adjustToxLoss(-3, FALSE)
|
||||
M.adjustToxLoss(-3, FALSE, TRUE)
|
||||
M.adjustOxyLoss(-3, FALSE)
|
||||
M.adjustBruteLoss(-3, FALSE)
|
||||
M.adjustFireLoss(-3, FALSE)
|
||||
|
||||
@@ -32,6 +32,12 @@
|
||||
value = REAGENT_VALUE_VERY_COMMON
|
||||
taste_description = "metal"
|
||||
|
||||
//It has stable IN THE NAME. IT WAS MADE FOR THIS MOMENT.
|
||||
/datum/reagent/stabilizing_agent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(myseed && chems.has_reagent(type, 1))
|
||||
myseed.adjust_instability(-1)
|
||||
|
||||
/datum/reagent/clf3
|
||||
name = "Chlorine Trifluoride"
|
||||
description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space."
|
||||
@@ -167,6 +173,15 @@
|
||||
taste_description = "burning"
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
// Smells like victory...
|
||||
/datum/reagent/napalm/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
|
||||
. = ..()
|
||||
if(chems.has_reagent(type, 1))
|
||||
if(!(myseed.resistance_flags & FIRE_PROOF))
|
||||
mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 6))
|
||||
mytray.adjustToxic(round(chems.get_reagent_amount(type) * 7))
|
||||
mytray.adjustWeeds(-rand(5,9)) //At least give them a small reward if they bother.
|
||||
|
||||
/datum/reagent/napalm/on_mob_life(mob/living/carbon/M)
|
||||
M.adjust_fire_stacks(1)
|
||||
..()
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
desc = "Take on the shape a lesser ash drake."
|
||||
invocation = "RAAAAAAAAWR!"
|
||||
|
||||
shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
|
||||
shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser/transformed
|
||||
|
||||
|
||||
/obj/shapeshift_holder
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
/datum/surgery_step/toxichealing/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] starts rejuvenating some of [target]'s flesh back to life.", "<span class='notice'>You start knitting some of [target]'s flesh back to life.</span>")
|
||||
|
||||
/datum/surgery_step/toxichealing/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
|
||||
if(..())
|
||||
while((target.getToxLoss() >= 1) || (target.getOxyLoss() >= 1))
|
||||
. = ..()
|
||||
if(!.)
|
||||
break
|
||||
|
||||
/datum/surgery_step/toxichealing/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] fixes some of [target]'s wounds.", "<span class='notice'>You succeed in fixing some of [target]'s wounds.</span>")
|
||||
target.heal_bodypart_damage(0,0,30) //Heals stam
|
||||
|
||||
@@ -381,6 +381,14 @@
|
||||
. = ..()
|
||||
LoadComponent(/datum/component/storage/concrete/tcg)
|
||||
|
||||
/obj/item/tcgcard_deck/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage/concrete/tcg)
|
||||
STR.storage_flags = STORAGE_FLAGS_LEGACY_DEFAULT
|
||||
STR.max_volume = DEFAULT_VOLUME_TINY * 30
|
||||
STR.max_w_class = DEFAULT_VOLUME_TINY
|
||||
STR.max_items = 30
|
||||
|
||||
/obj/item/tcgcard_deck/update_icon_state()
|
||||
. = ..()
|
||||
if(flipped)
|
||||
@@ -548,6 +556,7 @@
|
||||
desc = "A TCG-branded card binder, specifically for your infinite collection of TCG cards!"
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "binder"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
var/list/cards = list()
|
||||
var/list/decks = list()
|
||||
@@ -796,7 +805,13 @@
|
||||
var/list/card_types = list()
|
||||
for(var/obj/item/tcg_card/card in binder.cards)
|
||||
//if(!card.illegal) //Uncomment if you want to block syndie cards from saving
|
||||
card_types[card.datum_type] = card.illegal
|
||||
if(!(card.datum_type in card_types))
|
||||
card_types[card.datum_type] = card.illegal
|
||||
else
|
||||
if(islist(card_types[card.datum_type]))
|
||||
card_types[card.datum_type] += card.illegal
|
||||
else
|
||||
card_types[card.datum_type] = list(card_types[card.datum_type], card.illegal)
|
||||
|
||||
client.prefs.tcg_decks = binder.decks
|
||||
client.prefs.tcg_cards = card_types
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
#define BELLIES_MAX 20
|
||||
#define BELLIES_NAME_MIN 2
|
||||
#define BELLIES_NAME_MAX 12
|
||||
#define BELLIES_DESC_MAX 1024
|
||||
#define BELLIES_NAME_MAX 24
|
||||
#define BELLIES_DESC_MAX 4096
|
||||
|
||||
/mob/living/proc/insidePanel()
|
||||
set name = "Vore Panel"
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
## ON_CLONE - displayed after a successful cloning operation to the cloned person
|
||||
## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold
|
||||
## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold
|
||||
##
|
||||
## SDGF - displayed on SDGF clone spawning
|
||||
## SDGF_GOOD - displayed on SDGF clone spawning, if the clone is loyal
|
||||
## SDGF_BAD - displayed on SDGF clone spawning, if the clone is not loyal
|
||||
## PAI - displayed on PAI personality being loaded
|
||||
## EXAMPLE:
|
||||
## POLICYCONFIG ON_CLONE insert text here <span class='notice'>span classes are fully supported</span>
|
||||
|
||||
|
||||
@@ -50,6 +50,91 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">02 March 2021</h2>
|
||||
<h3 class="author">LetterN updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">colorpainter: let's not dispense null</li>
|
||||
</ul>
|
||||
<h3 class="author">SandPoot updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Changelings will actually become the person they want to be when using "human form" ability(after having used last resort).</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">01 March 2021</h2>
|
||||
<h3 class="author">SmArtKar updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixes decks breaking your screen</li>
|
||||
<li class="bugfix">Fixes binders not saving cards</li>
|
||||
<li class="bugfix">Fixes binders not saving multiple cards of the same type</li>
|
||||
</ul>
|
||||
<h3 class="author">Vynzill updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">cursed rice hat right in front of the jungle gateway's entrance is now removed from this dimensional plane</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">28 February 2021</h2>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Polychromic windbreaker's alt-click message is now coherent</li>
|
||||
<li class="code_imp">Toggleable suits now have an on_toggle proc to be overridden.</li>
|
||||
</ul>
|
||||
<h3 class="author">R3dtail updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">doubled max belly name length and quadrupled belly description length</li>
|
||||
</ul>
|
||||
<h3 class="author">SandPoot updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Body rejuvenation surgery will loop until the patient is completely healed.</li>
|
||||
</ul>
|
||||
<h3 class="author">dzahlus updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">fixes toxinlovers dying from heretic stuff that should heal them instead</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">27 February 2021</h2>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Lingfists (trait_mauler) now deal no stam damage and lost their 15(!!!) armor penetration.</li>
|
||||
</ul>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Tablets now protect their contents from rads.</li>
|
||||
</ul>
|
||||
<h3 class="author">TheObserver-sys updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Chems that should have been usable are now usable, try some cryoxadone on a plant today!!!</li>
|
||||
</ul>
|
||||
<h3 class="author">kappa-sama updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">cards and card binders are now small-class items</li>
|
||||
</ul>
|
||||
<h3 class="author">keronshb updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">16 > 10 unlock cost for stronger abilities</li>
|
||||
<li class="balance">Made nearly all other abilities for free.</li>
|
||||
</ul>
|
||||
<h3 class="author">kiwedespars updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">reverted the pr that absolutely gutted pugilism and made it worse than base unarmed, also gives it a second long stagger</li>
|
||||
<li class="balance">removed the ability to parry while horizontal, because that's dumb and makes it easy to just time the parries right.</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">chaplain arrythmic knives can no longer be abused for infinite speed.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">26 February 2021</h2>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">All machine-frame based tool-use actions now have state-checking callbacks.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">25 February 2021</h2>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Traitor / Ling objective amount should now be correct again.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">24 February 2021</h2>
|
||||
<h3 class="author">SandPoot updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -28591,3 +28591,54 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
silicons:
|
||||
- balance: xeno cube makes hostile xenos now, and drops a sentinel instead of a
|
||||
drone.
|
||||
2021-02-25:
|
||||
DeltaFire15:
|
||||
- bugfix: Traitor / Ling objective amount should now be correct again.
|
||||
2021-02-26:
|
||||
DeltaFire15:
|
||||
- code_imp: All machine-frame based tool-use actions now have state-checking callbacks.
|
||||
2021-02-27:
|
||||
Hatterhat:
|
||||
- balance: Lingfists (trait_mauler) now deal no stam damage and lost their 15(!!!)
|
||||
armor penetration.
|
||||
Putnam3145:
|
||||
- tweak: Tablets now protect their contents from rads.
|
||||
TheObserver-sys:
|
||||
- rscadd: Chems that should have been usable are now usable, try some cryoxadone
|
||||
on a plant today!!!
|
||||
kappa-sama:
|
||||
- tweak: cards and card binders are now small-class items
|
||||
keronshb:
|
||||
- balance: 16 > 10 unlock cost for stronger abilities
|
||||
- balance: Made nearly all other abilities for free.
|
||||
kiwedespars:
|
||||
- balance: reverted the pr that absolutely gutted pugilism and made it worse than
|
||||
base unarmed, also gives it a second long stagger
|
||||
- balance: removed the ability to parry while horizontal, because that's dumb and
|
||||
makes it easy to just time the parries right.
|
||||
silicons:
|
||||
- bugfix: chaplain arrythmic knives can no longer be abused for infinite speed.
|
||||
2021-02-28:
|
||||
Putnam3145:
|
||||
- bugfix: Polychromic windbreaker's alt-click message is now coherent
|
||||
- code_imp: Toggleable suits now have an on_toggle proc to be overridden.
|
||||
R3dtail:
|
||||
- tweak: doubled max belly name length and quadrupled belly description length
|
||||
SandPoot:
|
||||
- tweak: Body rejuvenation surgery will loop until the patient is completely healed.
|
||||
dzahlus:
|
||||
- bugfix: fixes toxinlovers dying from heretic stuff that should heal them instead
|
||||
2021-03-01:
|
||||
SmArtKar:
|
||||
- bugfix: Fixes decks breaking your screen
|
||||
- bugfix: Fixes binders not saving cards
|
||||
- bugfix: Fixes binders not saving multiple cards of the same type
|
||||
Vynzill:
|
||||
- bugfix: cursed rice hat right in front of the jungle gateway's entrance is now
|
||||
removed from this dimensional plane
|
||||
2021-03-02:
|
||||
LetterN:
|
||||
- bugfix: 'colorpainter: let''s not dispense null'
|
||||
SandPoot:
|
||||
- bugfix: Changelings will actually become the person they want to be when using
|
||||
"human form" ability(after having used last resort).
|
||||
|
||||
4
html/changelogs/AutoChangeLog-pr-14290.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-14290.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "SandPoot"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Legions should now pass their type to the person they infect (if valid)."
|
||||
4
html/changelogs/AutoChangeLog-pr-14295.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-14295.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscdel: "Fusion can no longer be done in open air."
|
||||
4
html/changelogs/AutoChangeLog-pr-14307.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-14307.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "\"Supermatter surge\" event, which might cause problems if the supermatter is not sufficiently cooled (i.e. the setup is messed up in some way)"
|
||||
4
html/changelogs/AutoChangeLog-pr-14320.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-14320.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscdel: "Valentine's day event no longer gives everyone a valentine's antag."
|
||||
4
html/changelogs/AutoChangeLog-pr-14322.yml
Normal file
4
html/changelogs/AutoChangeLog-pr-14322.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- config: "pAIs now have a policy config"
|
||||
5
html/changelogs/AutoChangeLog-pr-14324.yml
Normal file
5
html/changelogs/AutoChangeLog-pr-14324.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "dzahlus"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Added new subtype to lesser ash drake balanced around player control"
|
||||
- balance: "rebalanced dragon transformation to a 1 minute cooldown as well as using the new subtype of megafauna"
|
||||
5
html/changelogs/AutoChangeLog-pr-14327.yml
Normal file
5
html/changelogs/AutoChangeLog-pr-14327.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "qweq12yt"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "fixed infectious zombies not being able to attack if host was pacifist"
|
||||
- rscadd: "adds a way for species to have blacklisted quirks, the removal, and restoration of said quirks upon species changes"
|
||||
5
html/changelogs/AutoChangeLog-pr-14342.yml
Normal file
5
html/changelogs/AutoChangeLog-pr-14342.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: "MarinaGryphon"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "The AOOC mute pref is now properly respected."
|
||||
- bugfix: "Muting adminhelp sounds no longer mutes AOOC."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 460 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 133 KiB |
@@ -236,6 +236,22 @@
|
||||
name = "Grey Turtleneck"
|
||||
path = /obj/item/clothing/under/suit/turtle/grey
|
||||
|
||||
/datum/gear/uniform/purpleturtle
|
||||
name = "Purple Turtleneck"
|
||||
path = /obj/item/clothing/under/suit/turtle/purple
|
||||
|
||||
/datum/gear/uniform/orangeturtle
|
||||
name = "Orange Turtleneck"
|
||||
path = /obj/item/clothing/under/suit/turtle/orange
|
||||
|
||||
/datum/gear/uniform/blueturtle
|
||||
name = "Blue Turtleneck"
|
||||
path = /obj/item/clothing/under/suit/turtle/blue
|
||||
|
||||
/datum/gear/uniform/redturtle
|
||||
name = "Red Turtleneck"
|
||||
path = /obj/item/clothing/under/suit/turtle/red
|
||||
|
||||
/datum/gear/uniform/polyjump
|
||||
name = "Polychromic Jumpsuit"
|
||||
path = /obj/item/clothing/under/misc/polyjumpsuit
|
||||
|
||||
@@ -168,8 +168,8 @@
|
||||
/obj/item/projectile/bullet/cflechetteshredder //you only get this with a 30TC bundle,5 magazines, as such this should be the superior ammotype
|
||||
name = "flechette (shredder)"
|
||||
damage = 10
|
||||
dismemberment = 50
|
||||
wound_bonus = 50
|
||||
dismemberment = 15
|
||||
wound_bonus = 20
|
||||
armour_penetration = 100
|
||||
sharpness = SHARP_EDGED
|
||||
wound_falloff_tile = 0
|
||||
|
||||
@@ -2060,6 +2060,7 @@
|
||||
#include "code\modules\events\spider_infestation.dm"
|
||||
#include "code\modules\events\spontaneous_appendicitis.dm"
|
||||
#include "code\modules\events\stray_cargo.dm"
|
||||
#include "code\modules\events\supermatter_surge.dm"
|
||||
#include "code\modules\events\supernova.dm"
|
||||
#include "code\modules\events\travelling_trader.dm"
|
||||
#include "code\modules\events\vent_clog.dm"
|
||||
|
||||
Reference in New Issue
Block a user