Merge branch 'master' into communication-hotkeys

This commit is contained in:
Timothy Teakettle
2020-11-22 21:30:43 +00:00
committed by GitHub
494 changed files with 9051 additions and 8716 deletions
+2 -1
View File
@@ -783,7 +783,8 @@
if(ispath(chosen, /turf))
T.ChangeTurf(chosen)
else
var/obj/structure/closet/supplypod/centcompod/pod = new()
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/obj/structure/closet/supplypod/centcompod/pod = new(pick(get_area_turfs(pod_storage_area))) //Lets just have it in the pod bay for a moment instead of runtiming
var/atom/A = new chosen(pod)
A.flags_1 |= ADMIN_SPAWNED_1
new /obj/effect/pod_landingzone(T, pod)
+1 -1
View File
@@ -212,4 +212,4 @@
dat += build_antag_listing()
dat += "</body></html>"
usr << browse(dat.Join(), "window=roundstatus;size=500x500")
usr << browse(dat.Join(), "window=roundstatus;size=500x500")
+1 -1
View File
@@ -8,4 +8,4 @@
var/datum/cinematic/choice = input(src,"Cinematic","Choose",null) as anything in subtypesof(/datum/cinematic)
if(choice)
Cinematic(initial(choice.id),world,null)
Cinematic(initial(choice.id),world,null)
@@ -64,4 +64,4 @@
if(selected_type == log_type && selected_src == log_src)
slabel = "<b>\[[label]\]</b>"
return "<a href='?_src_=holder;[HrefToken()];individuallog=[REF(M)];log_type=[log_type];log_src=[log_src]'>[slabel]</a>"
return "<a href='?_src_=holder;[HrefToken()];individuallog=[REF(M)];log_type=[log_type];log_src=[log_src]'>[slabel]</a>"
+1 -1
View File
@@ -41,4 +41,4 @@
message_admins("[key_name_admin(usr)] is changing the map to [VM.map_name]")
log_admin("[key_name(usr)] is changing the map to [VM.map_name]")
if (SSmapping.changemap(VM) == 0)
message_admins("[key_name_admin(usr)] has changed the map to [VM.map_name]")
message_admins("[key_name_admin(usr)] has changed the map to [VM.map_name]")
+1 -1
View File
@@ -28,4 +28,4 @@ GLOBAL_VAR_INIT(highlander, FALSE)
addtimer(CALLBACK(src, .proc/only_one), 420)
/mob/living/carbon/human/proc/make_scottish()
mind.add_antag_datum(/datum/antagonist/highlander)
mind.add_antag_datum(/datum/antagonist/highlander)
+2 -1
View File
@@ -1347,7 +1347,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
new /obj/effect/immovablerod(startT, endT,target)
if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK)
var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text
var/obj/structure/closet/supplypod/centcompod/pod = new()
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/obj/structure/closet/supplypod/centcompod/pod = new(pick(get_area_turfs(pod_storage_area))) //Lets not runtime
pod.damage = 40
pod.explosionSize = list(0,0,0,2)
pod.effectStun = TRUE
@@ -27,4 +27,4 @@
if(!SSdbcore.Connect())
message_admins("Database connection failed: " + SSdbcore.ErrorMsg())
else
message_admins("Database connection re-established")
message_admins("Database connection re-established")
@@ -93,4 +93,4 @@
return "[header][item]</li>"
#undef VV_HTML_ENCODE
#undef VV_HTML_ENCODE
+1 -1
View File
@@ -98,7 +98,7 @@
L.adjustFireLoss(amount)
newamt = L.getFireLoss()
if("toxin")
L.adjustToxLoss(amount)
L.adjustToxLoss(amount, toxins_type = TOX_OMNI)
newamt = L.getToxLoss()
if("oxygen")
L.adjustOxyLoss(amount)
@@ -16,4 +16,4 @@
continue
var/datum/team/T = A.get_team()
if(!team_type || istype(T,team_type))
. |= T
. |= T
@@ -50,4 +50,4 @@
/datum/mind/proc/leave_all_antag_huds()
for(var/datum/atom_hud/antag/hud in GLOB.huds)
if(hud.hudusers[current])
hud.leave_hud(current)
hud.leave_hud(current)
@@ -52,4 +52,4 @@
user.temporarilyRemoveItemFromInventory(tool, TRUE)
var/obj/item/organ/heart/gland/gland = tool
gland.Insert(target, 2)
return 1
return 1
@@ -110,4 +110,4 @@
active = 0
/obj/item/organ/heart/gland/proc/activate()
return
return
@@ -17,4 +17,4 @@
/obj/item/organ/heart/gland/access/Remove(special = FALSE)
if(!QDELETED(owner))
UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
return ..()
return ..()
@@ -15,4 +15,4 @@
var/mob/living/carbon/human/H = owner
var/datum/species/species = H.dna.species
to_chat(H, "<span class='warning'>You feel your blood heat up for a moment.</span>")
species.exotic_blood = get_random_reagent_id()
species.exotic_blood = get_random_reagent_id()
@@ -17,4 +17,4 @@
var/chem_to_add = pick(possible_reagents)
owner.reagents.add_reagent(chem_to_add, 2)
owner.adjustToxLoss(-5, TRUE, TRUE)
..()
..()
@@ -12,4 +12,4 @@
/obj/item/organ/heart/gland/egg/activate()
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
var/turf/T = owner.drop_location()
new /obj/item/reagent_containers/food/snacks/egg/gland(T)
new /obj/item/reagent_containers/food/snacks/egg/gland(T)
@@ -24,4 +24,4 @@
/obj/item/organ/heart/gland/electric/proc/zap()
tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN)
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
@@ -175,4 +175,4 @@
var/obj/item/bodypart/chest/new_chest = new(null)
new_chest.replace_limb(owner, TRUE)
qdel(chest)
qdel(chest)
@@ -61,4 +61,4 @@
to_chat(H, "<span class='userdanger'>You feel the compulsion fade, and you <i>completely forget</i> about your previous orders.</span>")
H.clear_alert("mind_control")
active_mind_control = FALSE
return TRUE
return TRUE
@@ -19,4 +19,4 @@
var/turf/open/T = get_turf(owner)
if(istype(T))
T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
owner.vomit()
owner.vomit()
@@ -44,4 +44,4 @@
if(active_mind_control)
to_chat(entangled_mob, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
entangled_mob.clear_alert("mind_control")
..()
..()
@@ -23,4 +23,4 @@
var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
Slime.Friends = list(owner)
Slime.Leader = owner
Slime.Leader = owner
@@ -11,4 +11,4 @@
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
owner.faction |= "spiders"
var/obj/structure/spider/spiderling/S = new(owner.drop_location())
S.directive = "Protect your nest inside [owner.real_name]."
S.directive = "Protect your nest inside [owner.real_name]."
@@ -12,4 +12,4 @@
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
randomize_human(owner)
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
owner.set_species(species)
owner.set_species(species)
@@ -9,4 +9,4 @@
/obj/item/organ/heart/gland/ventcrawling/activate()
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
owner.ventcrawler = VENTCRAWLER_ALWAYS
owner.ventcrawler = VENTCRAWLER_ALWAYS
@@ -31,4 +31,4 @@
var/datum/symptom/S = new chosen_symptom
A.symptoms += S
A.Refresh() //just in case someone already made and named the same disease
return A
return A
@@ -9,4 +9,4 @@
/obj/structure/fluff/iced_abductor/Destroy()
var/turf/T = get_turf(src)
new /obj/effect/mob_spawn/human/abductor(T)
. = ..()
. = ..()
@@ -81,4 +81,4 @@
/datum/antagonist/bloodsucker/proc/AssignRandomBane()
return
return
@@ -113,4 +113,4 @@
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
*/
*/
@@ -24,4 +24,4 @@
/obj/effect/proc_holder/changeling/digitalcamo/on_refund(mob/user)
action.Remove(user)
user.digitalcamo = 0
user.digitalinvis = 0
user.digitalinvis = 0
@@ -57,4 +57,4 @@
/obj/screen/alert/status_effect/agent_pinpointer/changeling
name = "Pheromone Scent"
desc = "The nose always knows."
desc = "The nose always knows."
@@ -22,4 +22,4 @@
if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
desc = clockwork_desc
. = ..()
desc = initial(desc)
desc = initial(desc)
@@ -48,4 +48,4 @@
plane = FLOOR_PLANE
/obj/effect/clockwork/overlay/floor/bloodcult //this is used by BLOOD CULT, it shouldn't use such a path...
icon_state = "cult"
icon_state = "cult"
@@ -416,7 +416,7 @@
/obj/effect/clockwork/sigil/rite
name = "radiant sigil"
desc = "A glowing sigil glowing with barely-contained power."
desc = "A sigil glowing with barely-contained power."
clockwork_desc = "A sigil that will allow you to perform certain rites on it, provided you have access to sufficient power and materials."
icon_state = "sigiltransmission" //am big lazy - recolored transmission sigil
sigil_name = "Sigil of Rites"
@@ -440,7 +440,8 @@
return
var/list/possible_rites = list()
for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites)
possible_rites[R] = R
if(is_servant_of_ratvar(user, require_full_power = TRUE) || !R.requires_full_power)
possible_rites[R] = R
var/input_key = input(user, "Choose a rite", "Choosing a rite") as null|anything in possible_rites
if(!input_key)
return
@@ -287,4 +287,4 @@
linked_gateway.visible_message("<span class='warning'>[linked_gateway] begins to destabilise!</span>")
/obj/effect/clockwork/spatial_gateway/stable/pass_through_gateway(atom/movable/A, no_cost = TRUE)
return ..()
return ..()
@@ -6,12 +6,13 @@
//The base clockwork rite. This should never be visible
/datum/clockwork_rite
var/name = "Rite of THE frog" //The name of the rite
var/desc = "This rite is used to summon the legendary frog whose-name-shall-not-be-spoken, ender of many worlds." //What does this rite do? Shown to cultists if they choose 'Show Info' after selecting the rite.
var/desc = "This rite is used to summon the legendary frog whose-name-shall-not-be-spoken, ender of many worlds." //What does this rite do? Shown to servants if they choose 'Show Info' after selecting the rite.
var/list/required_ingredients = list(/obj/item/clockwork) //What does this rite require?
var/power_cost = 0 //How much power does this rite cost.. or does it even add power?
var/requires_human = FALSE //Does the rite require a ../carbon/human on the rune?
var/requires_human = FALSE //Does the rite require a ../carbon/human on the sigil?
var/must_be_servant = TRUE //If the above is true, does the human need to be a servant?
var/target_can_be_invoker = TRUE //Does this rite work if the invoker is also the target?
var/requires_full_power = FALSE //Does the invoker need to be an actual full-on servant, or is this available to neutered ones aswell?
var/cast_time = 0 //How long does the rite take to cast?
var/limit = INFINITE //How often can this rite be used per round? Set this to INFINITE for unlimited, 0 for disallowed, anything above 0 for a limit
var/times_used = 0 //How often has the rite already been used this shift?
@@ -99,7 +99,7 @@
else
..()
/obj/item/clockwork/slab/cyborg/ratvar_act()
/obj/item/clockwork/slab/cyborg/ui_act()
..()
if(!GLOB.ratvar_awakens)
SStgui.close_uis(src)
@@ -349,4 +349,4 @@
if(GLOB.ratvar_awakens)
portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned
duration = max(duration, 100)
return slab.procure_gateway(invoker, duration, portal_uses)
return slab.procure_gateway(invoker, duration, portal_uses)
@@ -83,4 +83,4 @@
anchored = !anchored
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] \the [src].</span>")
I.play_tool_sound(src)
return TRUE
return TRUE
@@ -17,4 +17,4 @@
return
audible_message("<i>*click*</i>")
playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
activate()
activate()
@@ -115,4 +115,4 @@
rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune1
rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune1/inner
rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune1/center
rune_color = RUNE_COLOR_MEDIUMRED
rune_color = RUNE_COLOR_MEDIUMRED
@@ -35,4 +35,4 @@
DefaultCombatKnockdown(40)
qdel(weapon)
return 2
return 1
return 1
@@ -20,4 +20,4 @@
explanation_text = "You are the BEST thing on the station. Make sure everyone knows it."
/datum/objective/sintouched/acedia
explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job."
explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job."
@@ -105,7 +105,7 @@
/mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
return 666
/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0)
if(mind && has_bane(BANE_LIGHT))
mind.disrupt_spells(-500)
return ..() //flashes don't stop devils UNLESS it's their bane.
@@ -6,4 +6,4 @@
/datum/antagonist/magic_servant/proc/setup_master(mob/M)
var/datum/objective/O = new("Serve [M.real_name].")
O.owner = owner
objectives |= O
objectives |= O
@@ -178,4 +178,4 @@
/obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/user)
if(active)
to_chat(user, "<span class='danger'>Your chameleon field deactivates.</span>")
deactivate(user)
deactivate(user)
+1 -1
View File
@@ -28,4 +28,4 @@
santa_objective.explanation_text = "Bring joy and presents to the station!"
santa_objective.completed = 1 //lets cut our santas some slack.
santa_objective.owner = owner
objectives |= santa_objective
objectives |= santa_objective
@@ -16,4 +16,4 @@
return nation
/datum/antagonist/separatist/greet()
to_chat(owner, "<B>You are a separatist! [nation.name] forever! Protect the sovereignty of your newfound land with your comrades in arms!</B>")
to_chat(owner, "<B>You are a separatist! [nation.name] forever! Protect the sovereignty of your newfound land with your comrades in arms!</B>")
@@ -187,8 +187,8 @@
partner_outfit.equip(partner)
var/obj/structure/closet/supplypod/arrival_pod = new()
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/obj/structure/closet/supplypod/arrival_pod = new(pick(get_area_turfs(pod_storage_area)))
arrival_pod.style = STYLE_SYNDICATE
arrival_pod.explosionSize = list(0,0,0,1)
arrival_pod.bluespace = TRUE
@@ -59,7 +59,8 @@
// Launch the pod to collect our victim.
/datum/syndicate_contract/proc/launch_extraction_pod(turf/empty_pod_turf)
var/obj/structure/closet/supplypod/extractionpod/empty_pod = new()
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/obj/structure/closet/supplypod/extractionpod/empty_pod = new(pick(get_area_turfs(pod_storage_area))) //Lets not runtime
RegisterSignal(empty_pod, COMSIG_ATOM_ENTERED, .proc/enter_check)
@@ -180,8 +181,8 @@
if(possible_drop_loc.len > 0)
var/pod_rand_loc = rand(1, possible_drop_loc.len)
var/obj/structure/closet/supplypod/return_pod = new()
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/obj/structure/closet/supplypod/return_pod = new(pick(get_area_turfs(pod_storage_area)))
return_pod.bluespace = TRUE
return_pod.explosionSize = list(0,0,0,0)
return_pod.style = STYLE_SYNDICATE
@@ -16,4 +16,4 @@
/datum/antagonist/heartbreaker/greet()
to_chat(owner, "<span class='warning'><B>You didn't get a date! They're all having fun without you! you'll show them though...</B></span>")
owner.announce_objectives()
owner.announce_objectives()
@@ -249,7 +249,7 @@
S.name = "Shade of [T.real_name]"
S.real_name = "Shade of [T.real_name]"
T.transfer_ckey(S)
S.original_mind = T.mind.current
S.original_mind = T.mind
S.copy_languages(T, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder.
S.update_atom_languages()
grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue
+1 -1
View File
@@ -134,4 +134,4 @@
toggle_visibility(D.features["breasts_visibility"], FALSE)
#undef BREASTS_ICON_MIN_SIZE
#undef BREASTS_ICON_MAX_SIZE
#undef BREASTS_ICON_MAX_SIZE
+1 -1
View File
@@ -106,4 +106,4 @@
diameter_ratio = D.features["cock_diameter_ratio"]
shape = D.features["cock_shape"]
prev_length = length
toggle_visibility(D.features["cock_visibility"], FALSE)
toggle_visibility(D.features["cock_visibility"], FALSE)
+1 -1
View File
@@ -13,4 +13,4 @@ Name: IsAssemblyHolder
Desc: If true is an object that can hold an assemblyholder object
*/
/obj/proc/IsAssemblyHolder()
return FALSE
return FALSE
+1 -1
View File
@@ -48,4 +48,4 @@
/obj/item/assembly/playback/toggle_secure()
. = ..()
listening = FALSE
listening = FALSE
@@ -336,4 +336,4 @@
return TRUE
/obj/machinery/atmospherics/proc/update_layer()
layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE
layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE
@@ -106,4 +106,4 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
/obj/machinery/atmospherics/components/binary/valve/digital/on/layer3
piping_layer = 3
icon_state = "dvalve_map-3"
icon_state = "dvalve_map-3"
@@ -170,4 +170,4 @@
/obj/machinery/atmospherics/components/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(airs, user, src)
return TRUE
return TRUE
@@ -42,4 +42,4 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer3
piping_layer = 3
icon_state = "pipe11-3"
icon_state = "pipe11-3"
@@ -35,4 +35,4 @@
/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3
piping_layer = 3
icon_state = "pipe11-3"
icon_state = "pipe11-3"
@@ -38,4 +38,4 @@
if(nodes[i])
add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) )
update_layer()
update_alpha()
update_alpha()
@@ -36,4 +36,4 @@
if(nodes[i])
add_overlay( getpipeimage(icon, "pipe-[piping_layer]", get_dir(src, nodes[i])) )
update_layer()
update_alpha()
update_alpha()
@@ -30,4 +30,4 @@
/obj/machinery/atmospherics/pipe/simple/update_icon()
icon_state = "pipe[nodes[1] ? "1" : "0"][nodes[2] ? "1" : "0"]-[piping_layer]"
update_layer()
update_alpha()
update_alpha()
+1 -1
View File
@@ -26,4 +26,4 @@ obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe wh
above.nodes += src //Two way travel :)
return ..()
else
return ..()
return ..()
+1 -1
View File
@@ -27,4 +27,4 @@
/obj/effect/wind/process()
var/turf/open/T = get_turf(src)
if(istype(T))
T.consider_pressure_difference(get_step(T,dir),strength)
T.consider_pressure_difference(get_step(T,dir),strength)
+1 -1
View File
@@ -10,4 +10,4 @@
new /obj/item/implantcase/exile(src)
new /obj/item/implantcase/exile(src)
new /obj/item/implantcase/exile(src)
new /obj/item/implantcase/exile(src)
new /obj/item/implantcase/exile(src)
@@ -155,4 +155,4 @@
endTurfX = 159
endTurfY = 157
startTurfX = 37
startTurfY = 35
startTurfY = 35
@@ -60,4 +60,4 @@
teams never did figure out what happened that last time... and I can't wrap my head \
around it myself. Why would a shuttle full of evacuees all snap and beat each other \
to death the moment they reached safety?<br>\
- D. Cereza"
- D. Cereza"
@@ -41,4 +41,4 @@
rare_pet_monkey_names = list("Sun Mukong", "Monkey Kong")
/mob/living/simple_animal/hostile/jungle/leaper/boss
health = 450
health = 450
@@ -150,4 +150,4 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
mezzer()
/obj/singularity/narsie/mini/ex_act()
return
return
+1 -1
View File
@@ -65,4 +65,4 @@ BSQL_DEL_PROC(/datum/BSQL_Connection)
return null;
. = world._BSQL_Internal_Call("QuoteString", id, "[str]")
if(!.)
BSQL_ERROR("Library failed to provide quote for [str]!")
BSQL_ERROR("Library failed to provide quote for [str]!")
+1 -1
View File
@@ -88,4 +88,4 @@
deselect_region()
return
/datum/buildmode_mode/proc/handle_selected_area(client/c, params)
/datum/buildmode_mode/proc/handle_selected_area(client/c, params)
+1 -1
View File
@@ -158,4 +158,4 @@
#undef BM_SWITCHSTATE_NONE
#undef BM_SWITCHSTATE_MODE
#undef BM_SWITCHSTATE_DIR
#undef BM_SWITCHSTATE_DIR
+1 -1
View File
@@ -86,4 +86,4 @@
/obj/screen/buildmode/quit/Click()
bd.quit()
return 1
return 1
+1 -1
View File
@@ -25,4 +25,4 @@
cl.images -= I
cl = null
QDEL_NULL(I)
return ..()
return ..()
+1 -1
View File
@@ -59,4 +59,4 @@
else
var/obj/A = new objholder(T)
A.setDir(BM.build_dir)
log_admin("Build Mode: [key_name(c)] with path [objholder], filled the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]")
log_admin("Build Mode: [key_name(c)] with path [objholder], filled the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]")
+1 -1
View File
@@ -45,4 +45,4 @@
var/confirm = alert("Are you sure you want run the map generator?", "Run generator", "Yes", "No")
if(confirm == "Yes")
G.generate()
log_admin("Build Mode: [key_name(c)] ran the map generator '[G.buildmode_name]' in the region from [AREACOORD(cornerA)] to [AREACOORD(cornerB)]")
log_admin("Build Mode: [key_name(c)] ran the map generator '[G.buildmode_name]' in the region from [AREACOORD(cornerA)] to [AREACOORD(cornerB)]")
+1 -1
View File
@@ -227,4 +227,4 @@
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate)
multiplier = 6
bonus_desc = "Under no circumstances mention this shipment to security."
foodtype = "\"meal\""
foodtype = "\"meal\""
+1 -1
View File
@@ -136,4 +136,4 @@
description = "There's a debate around command as to weather or not ribs should be considered finger food, and we need a few delicious racks to process."
reward = 2250
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs)
wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs)
+1 -1
View File
@@ -62,4 +62,4 @@
description = "Apparently people are putting vegetables on kebabs now. Central Command has taken an interest in this turn of events and would like to know more."
reward = 2600
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/fiesta)
wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/fiesta)
+6 -5
View File
@@ -72,7 +72,7 @@
holder = user_mob.client //if its a mob, assign the mob's client to holder
bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //Locate the default bay (one) from the centcom map
bayNumber = bay.loading_id //Used as quick reference to what bay we're taking items from
var/area/pod_storage_area = locate(/area/centcom/supplypod/pod_storage) in GLOB.sortedAreas
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
temp_pod = new(pick(get_area_turfs(pod_storage_area))) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed)
orderedArea = createOrderedArea(bay) //Order all the turfs in the selected bay (top left to bottom right) to a single list. Used for the "ordered" mode (launchChoice = 1)
selector = new(null, holder.mob)
@@ -638,7 +638,7 @@
refreshView()
/area/centcom/supplypod/pod_storage/Initialize(mapload) //temp_pod holding area
. = ..()
. = ..()
var/obj/imgbound = locate() in locate(200,SUPPLYPOD_X_OFFSET*-4.5, 1)
call(GLOB.podlauncher, "RegisterSignal")(imgbound, "ct[GLOB.podstyles[14][9]]", "[GLOB.podstyles[14][10]]dlauncher")
@@ -702,10 +702,11 @@
/datum/centcom_podlauncher/proc/launch(turf/target_turf) //Game time started
if (isnull(target_turf))
return
var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result
var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod, sameloc = TRUE) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result
toLaunch.update_icon()//we update_icon() here so that the door doesnt "flicker on" right after it lands
var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding]
toLaunch.forceMove(shippingLane)
//We don't have this area, lets just have it where we had the temp pod
//var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding]
//toLaunch.forceMove(shippingLane)
if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those
if(launchRandomItem)
var/launch_candidate = pick_n_take(launchList)
+1 -1
View File
@@ -100,4 +100,4 @@
/datum/export/material/runite
cost = 300
message = "cm3 of runite"
material_id = /datum/material/runite
material_id = /datum/material/runite
+2 -2
View File
@@ -11,7 +11,7 @@
allow_dense = TRUE
delivery_icon = null
can_weld_shut = FALSE
armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80)
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
anchored = TRUE //So it cant slide around after landing
anchorable = FALSE
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
@@ -167,7 +167,7 @@
. += decal
return
else if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) //If we're not a normal pod shape (aka, if we don't have fins), just add the door without masking
. += door
. += door
else
var/icon/masked_door = new(icon, door) //The door we want to apply
var/icon/fin_masker = new(icon, "mask_[fin_mask]") //The fin shape we want to 'cut out' of the door
+1 -1
View File
@@ -7,4 +7,4 @@ GLOBAL_LIST_EMPTY(clientmessages)
var/list/L = GLOB.clientmessages[ckey]
if(!L)
GLOB.clientmessages[ckey] = L = list()
L += message
L += message
+1 -1
View File
@@ -3,4 +3,4 @@
var/list/logging = list()
var/list/post_login_callbacks = list()
var/list/post_logout_callbacks = list()
var/byond_version = "Unknown"
var/byond_version = "Unknown"
+78 -72
View File
@@ -101,73 +101,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/eye_type = DEFAULT_EYES_TYPE //Eye type
var/split_eye_colors = FALSE
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFFFFF",
"mcolor2" = "FFFFFF",
"mcolor3" = "FFFFFF",
"tail_lizard" = "Smooth",
"tail_human" = "None",
"snout" = "Round",
"horns" = "None",
"horns_color" = "85615a",
"ears" = "None",
"wings" = "None",
"wings_color" = "FFF",
"frills" = "None",
"deco_wings" = "None",
"spines" = "None",
"body_markings" = "None",
"legs" = "Plantigrade",
"insect_wings" = "Plain",
"insect_fluff" = "None",
"insect_markings" = "None",
"arachnid_legs" = "Plain",
"arachnid_spinneret" = "Plain",
"arachnid_mandibles" = "Plain",
"mam_body_markings" = "Plain",
"mam_ears" = "None",
"mam_snouts" = "None",
"mam_tail" = "None",
"mam_tail_animated" = "None",
"xenodorsal" = "Standard",
"xenohead" = "Standard",
"xenotail" = "Xenomorph Tail",
"taur" = "None",
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = DEF_COCK_SHAPE,
"cock_length" = COCK_SIZE_DEF,
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "ffffff",
"cock_taur" = FALSE,
"has_balls" = FALSE,
"balls_color" = "ffffff",
"balls_shape" = DEF_BALLS_SHAPE,
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
"has_breasts" = FALSE,
"breasts_color" = "ffffff",
"breasts_size" = BREASTS_SIZE_DEF,
"breasts_shape" = DEF_BREASTS_SHAPE,
"breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = DEF_VAGINA_SHAPE,
"vag_color" = "ffffff",
"has_womb" = FALSE,
"balls_visibility" = GEN_VISIBLE_NO_UNDIES,
"breasts_visibility"= GEN_VISIBLE_NO_UNDIES,
"cock_visibility" = GEN_VISIBLE_NO_UNDIES,
"vag_visibility" = GEN_VISIBLE_NO_UNDIES,
"ipc_screen" = "Sunburst",
"ipc_antenna" = "None",
"flavor_text" = "",
"silicon_flavor_text" = "",
"ooc_notes" = "",
"meat_type" = "Mammalian",
"body_model" = MALE,
"body_size" = RESIZE_DEFAULT_SIZE
)
var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
var/custom_tongue = "default" //if your tongue is to be something other than your races
var/modified_limbs = list() //prosthetic/amputated limbs
@@ -470,6 +405,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!use_skintones)
dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Advanced Coloring</h3>"
dat += "</b><a style='display:block;width:100px' href='?_src_=prefs;preference=color_scheme;task=input'>[(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) ? "Enabled" : "Disabled"]</a>"
dat += "<h2>Body Colors</h2>"
dat += "<b>Primary Color:</b><BR>"
@@ -551,6 +489,52 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button
if(color_type)
dat += "<span style='border:1px solid #161616; background-color: #[features[color_type]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=[color_type];task=input'>Change</a><BR>"
else
if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) //advanced individual part colouring system
//is it matrixed or does it have extra parts to be coloured?
var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part]
var/find_part_list = GLOB.mutant_reference_list[mutant_part]
if(find_part && find_part != "None" && find_part_list)
var/datum/sprite_accessory/accessory = find_part_list[find_part]
if(accessory)
if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future
var/mutant_string = accessory.mutant_part_string
if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
continue
var/primary_feature = "[mutant_string]_primary"
var/secondary_feature = "[mutant_string]_secondary"
var/tertiary_feature = "[mutant_string]_tertiary"
if(!features[primary_feature])
features[primary_feature] = features["mcolor"]
if(!features[secondary_feature])
features[secondary_feature] = features["mcolor2"]
if(!features[tertiary_feature])
features[tertiary_feature] = features["mcolor3"]
var/matrixed_sections = accessory.matrixed_sections
if(accessory.color_src == MATRIXED && !matrixed_sections)
message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
continue
else if(accessory.color_src == MATRIXED)
switch(matrixed_sections)
if(MATRIX_GREEN) //only composed of a green section
primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section
if(MATRIX_BLUE)
primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section
if(MATRIX_RED_BLUE) //composed of a red and blue section
secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary
if(MATRIX_GREEN_BLUE) //composed of a green and blue section
primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary
secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary
dat += "<b>Primary Color</b><BR>"
dat += "<span style='border:1px solid #161616; background-color: #[features[primary_feature]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=[primary_feature];task=input'>Change</a><BR>"
if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3)))
dat += "<b>Secondary Color</b><BR>"
dat += "<span style='border:1px solid #161616; background-color: #[features[secondary_feature]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=[secondary_feature];task=input'>Change</a><BR>"
if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3)))
dat += "<b>Tertiary Color</b><BR>"
dat += "<span style='border:1px solid #161616; background-color: #[features[tertiary_feature]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=[tertiary_feature];task=input'>Change</a><BR>"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += "</td>"
@@ -1551,10 +1535,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/prosthetic_type = input(user, "Choose the type of prosthetic", "Character Preference") as null|anything in (list("prosthetic") + GLOB.prosthetic_limb_types)
if(prosthetic_type)
var/number_of_prosthetics = 0
for(var/modification in modified_limbs)
if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC)
for(var/modified_limb in modified_limbs)
if(modified_limbs[modified_limb][1] == LOADOUT_LIMB_PROSTHETIC && modified_limb != limb_type)
number_of_prosthetics += 1
if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS && !(limb_type in modified_limbs && modified_limbs[limb_type][1] == LOADOUT_LIMB_PROSTHETIC))
if(number_of_prosthetics > MAXIMUM_LOADOUT_PROSTHETICS)
to_chat(user, "<span class='danger'>You can only have up to two prosthetic limbs!</span>")
else
//save the actual prosthetic data
@@ -2033,6 +2017,30 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_dors)
features["xenodorsal"] = new_dors
//every single primary/secondary/tertiary colouring done at once
if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary")
var/the_feature = features[href_list["preference"]]
if(!the_feature)
features[href_list["preference"]] = "FFFFFF"
the_feature = "FFFFFF"
var/new_feature_color = input(user, "Choose your character's mutant part colour:", "Character Preference","#"+features[href_list["preference"]]) as color|null
if(new_feature_color)
var/temp_hsv = RGBtoHSV(new_feature_color)
if(new_feature_color == "#000000")
features[href_list["preference"]] = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3])
features[href_list["preference"]] = sanitize_hexcolor(new_feature_color, 6)
else
to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>")
//advanced color mode toggle
if("color_scheme")
if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING)
features["color_scheme"] = OLD_CHARACTER_COLORING
else
features["color_scheme"] = ADVANCED_CHARACTER_COLORING
//Genital code
if("cock_color")
var/new_cockcolor = input(user, "Penis color:", "Character Preference","#"+features["cock_color"]) as color|null
@@ -2761,8 +2769,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_limb.replace_limb(character)
qdel(old_part)
character.regenerate_icons()
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
//let's be sure the character updates
+107 -6
View File
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
#define SAVEFILE_VERSION_MAX 38
#define SAVEFILE_VERSION_MAX 44
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -226,15 +226,58 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
left_eye_color = "#BAB99E"
right_eye_color = "#BAB99E"
if(current_version < 5000)
if(current_version < 43) //extreme changes to how things are coloured (the introduction of the advanced coloring system)
features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default
for(var/feature in features)
var/feature_value = features[feature]
if(feature_value)
var/ref_list = GLOB.mutant_reference_list[feature]
if(ref_list)
var/datum/sprite_accessory/accessory = ref_list[feature_value]
if(accessory)
var/mutant_string = accessory.mutant_part_string
if(!mutant_string)
if(istype(accessory, /datum/sprite_accessory/mam_body_markings))
mutant_string = "mam_body_markings"
var/primary_string = "[mutant_string]_primary"
var/secondary_string = "[mutant_string]_secondary"
var/tertiary_string = "[mutant_string]_tertiary"
if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None")
message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
continue
var/primary_exists = features[primary_string]
var/secondary_exists = features[secondary_string]
var/tertiary_exists = features[tertiary_string]
if(accessory.color_src == MATRIXED && !primary_exists && !secondary_exists && !tertiary_exists)
features[primary_string] = features["mcolor"]
features[secondary_string] = features["mcolor2"]
features[tertiary_string] = features["mcolor3"]
else if(accessory.color_src == MUTCOLORS && !primary_exists)
features[primary_string] = features["mcolor"]
else if(accessory.color_src == MUTCOLORS2 && !secondary_exists)
features[secondary_string] = features["mcolor2"]
else if(accessory.color_src == MUTCOLORS3 && !tertiary_exists)
features[tertiary_string] = features["mcolor3"]
features["color_scheme"] = OLD_CHARACTER_COLORING //advanced is off by default
if(current_version < 44)
var/ctrl_t_binding = S["key_bindings"]["CtrlT"]
var/ctrl_m_binding = S["key_bindings"]["CtrlM"]
if(length(ctrl_t_binding) && "say_with_indicator" in ctrl_t_binding)
S["key_bindings"]["T"] = "say_with_indicator"
S["key_bindings"]["CtrlT"] = "say"
if(!length(S["key_bindings"]["T"]))
S["key_bindings"]["T"] = list("say_with_indicator")
else
S["key_bindings"]["T"] += "say_with_indicator"
S["key_bindings"]["CtrlT"] -= "say_with_indicator"
S["key_bindings"]["CtrlT"] += "say"
if(length(ctrl_m_binding) && "me_with_indicator" in ctrl_m_binding)
S["key_bindings"]["M"] = "me_with_indicator"
S["key_bindings"]["CtrlM"] = "me"
if(!length(S["key_bindings"]["M"])
S["key_bindings"]["M"] = list("me_with_indicator")
else
S["key_bindings"]["M"] += "me_with_indicator"
S["key_bindings"]["CtrlM"] -= "me_with_indicator"
S["key_bindings"]["CtrlM"] == "me"
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -499,6 +542,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
var/savefile/S = new /savefile(path)
if(!S)
return FALSE
features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
S.cd = "/"
if(!slot)
slot = default_slot
@@ -579,6 +624,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_arachnid_mandibles"] >> features["arachnid_mandibles"]
S["feature_horns_color"] >> features["horns_color"]
S["feature_wings_color"] >> features["wings_color"]
S["feature_color_scheme"] >> features["color_scheme"]
S["persistent_scars"] >> persistent_scars
S["scars1"] >> scars_list["1"]
S["scars2"] >> scars_list["2"]
@@ -604,6 +650,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Jobs
S["joblessrole"] >> joblessrole
//Load prefs
S["job_preferences"] >> job_preferences
@@ -656,6 +703,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_vag_visibility"] >> features["vag_visibility"]
//womb features
S["feature_has_womb"] >> features["has_womb"]
//flavor text
//Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts:
if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists.
@@ -813,6 +861,32 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN)
features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN)
//load every advanced coloring mode thing in one go
//THIS MUST BE DONE AFTER ALL FEATURE SAVES OR IT WILL NOT WORK
for(var/feature in features)
var/feature_value = features[feature]
if(feature_value)
var/ref_list = GLOB.mutant_reference_list[feature]
if(ref_list)
var/datum/sprite_accessory/accessory = ref_list[feature_value]
if(accessory)
var/mutant_string = accessory.mutant_part_string
if(!mutant_string)
if(istype(accessory, /datum/sprite_accessory/mam_body_markings))
mutant_string = "mam_body_markings"
var/primary_string = "[mutant_string]_primary"
var/secondary_string = "[mutant_string]_secondary"
var/tertiary_string = "[mutant_string]_tertiary"
if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None")
message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
continue
if(S["feature_[primary_string]"])
S["feature_[primary_string]"] >> features[primary_string]
if(S["feature_[secondary_string]"])
S["feature_[secondary_string]"] >> features[secondary_string]
if(S["feature_[tertiary_string]"])
S["feature_[tertiary_string]"] >> features[tertiary_string]
persistent_scars = sanitize_integer(persistent_scars)
scars_list["1"] = sanitize_text(scars_list["1"])
scars_list["2"] = sanitize_text(scars_list["2"])
@@ -937,6 +1011,33 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
WRITE_FILE(S["feature_color_scheme"], features["color_scheme"])
//save every advanced coloring mode thing in one go
for(var/feature in features)
var/feature_value = features[feature]
if(feature_value)
var/ref_list = GLOB.mutant_reference_list[feature]
if(ref_list)
var/datum/sprite_accessory/accessory = ref_list[feature_value]
if(accessory)
var/mutant_string = accessory.mutant_part_string
if(!mutant_string)
if(istype(accessory, /datum/sprite_accessory/mam_body_markings))
mutant_string = "mam_body_markings"
var/primary_string = "[mutant_string]_primary"
var/secondary_string = "[mutant_string]_secondary"
var/tertiary_string = "[mutant_string]_tertiary"
if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None")
message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!")
continue
if(features[primary_string])
WRITE_FILE(S["feature_[primary_string]"], features[primary_string])
if(features[secondary_string])
WRITE_FILE(S["feature_[secondary_string]"], features[secondary_string])
if(features[tertiary_string])
WRITE_FILE(S["feature_[tertiary_string]"], features[tertiary_string])
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
+1 -1
View File
@@ -87,4 +87,4 @@
msg += "<span class='info'>Adminhelps are also sent to Discord. If no admins are available in game adminhelp anyways and an admin on Discord will see it and respond.</span>"
to_chat(src, msg)
*/
*/
+1 -1
View File
@@ -42,4 +42,4 @@
// Called just before an attack_hand(), in mob/UnarmedAttack()
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
return FALSE // return TRUE to cancel attack_hand()
return FALSE // return TRUE to cancel attack_hand()
+1 -1
View File
@@ -61,4 +61,4 @@
..()
if(ismob(loc))
var/mob/M = loc
M.update_inv_head()
M.update_inv_head()
+1 -1
View File
@@ -80,4 +80,4 @@
icon_state = "waldo_hat"
item_state = "waldo_hat"
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
+1 -1
View File
@@ -167,4 +167,4 @@
/obj/item/clothing/head/hardhat/weldhat/dblue
icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue"
hat_type = "dblue"
hat_type = "dblue"
+1 -1
View File
@@ -161,4 +161,4 @@
head = /obj/item/clothing/head/helmet/space/plasmaman/clown
uniform = /obj/item/clothing/under/plasmaman/clown
mask = /obj/item/clothing/mask/gas/clown_hat
mask = /obj/item/clothing/mask/gas/clown_hat
+1 -1
View File
@@ -46,4 +46,4 @@
/obj/item/paper/fluff/vr/fluke_ops
name = "Where is my uplink?"
info = "Use the radio in your backpack."
info = "Use the radio in your backpack."
+1 -1
View File
@@ -140,4 +140,4 @@
if(id_slot)
var/obj/item/card/id/card = id_slot.GetID()
if(istype(card))
card.access |= stored_access
card.access |= stored_access
+1 -1
View File
@@ -60,4 +60,4 @@
to_chat(user, "<span class='warning'>You need bananium to turn the prototype shoes on!</span>")
/obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon_state()
icon_state = "clown_prototype_[on? "on" : "off"]"
icon_state = "clown_prototype_[on? "on" : "off"]"
+1 -1
View File
@@ -33,4 +33,4 @@
for(var/spell in spells)
var/obj/effect/proc_holder/spell/S = spell
H.mind.spell_list.Remove(S)
qdel(S)
qdel(S)

Some files were not shown because too many files have changed in this diff Show More