mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-25 14:16:58 +01:00
Merge branch 'master' into protean-rework
This commit is contained in:
@@ -1,3 +1,10 @@
|
||||
/datum/preferences
|
||||
var/digitigrade = 0 // 0 = no digi, 1 = default, 2+ = digi styles... (Not used yet)
|
||||
|
||||
var/job_other_low = 0
|
||||
var/job_other_med = 0
|
||||
var/job_other_high = 0
|
||||
|
||||
/client/verb/toggle_random_emote_pitch()
|
||||
set name = "Toggle Random Emote Pitch"
|
||||
set category = "Preferences"
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/datum/spawnpoint/stationgateway
|
||||
display_name = "Station gateway"
|
||||
msg = "has completed translation from station gateway"
|
||||
disallow_job = list("Non-Crew")
|
||||
|
||||
/datum/spawnpoint/stationgateway/New()
|
||||
..()
|
||||
turfs = latejoin_gatewaystation
|
||||
|
||||
/datum/spawnpoint/vore
|
||||
display_name = "Vorespawn - Prey"
|
||||
msg = "has arrived on the station"
|
||||
allow_offmap_spawn = TRUE
|
||||
|
||||
/datum/spawnpoint/vore/pred
|
||||
display_name = "Vorespawn - Pred"
|
||||
msg = "has arrived on the station"
|
||||
|
||||
/datum/spawnpoint/vore/New()
|
||||
..()
|
||||
turfs = latejoin
|
||||
|
||||
/datum/spawnpoint/plainspath
|
||||
display_name = "Sif plains"
|
||||
msg = "has checked in at the plains gate"
|
||||
restrict_job = list("Non-Crew")
|
||||
|
||||
/datum/spawnpoint/plainspath/New()
|
||||
..()
|
||||
turfs = latejoin_plainspath
|
||||
@@ -1,18 +1,25 @@
|
||||
/mob/living/carbon/human/update_fullness()
|
||||
var/previous_stomach_fullness = vore_fullness_ex["stomach"]
|
||||
var/previous_taur_fullness = vore_fullness_ex["taur belly"]
|
||||
//update_vore_tail_sprite()
|
||||
//update_vore_belly_sprite()
|
||||
. = ..()
|
||||
if(vore_fullness_ex["stomach"] != previous_stomach_fullness)
|
||||
update_vore_belly_sprite()
|
||||
if(vore_fullness_ex["taur belly"] != previous_taur_fullness)
|
||||
update_vore_tail_sprite()
|
||||
var/previous_stomach_fullness = vore_fullness_ex["stomach"]
|
||||
var/previous_taur_fullness = vore_fullness_ex["taur belly"]
|
||||
//update_vore_tail_sprite()
|
||||
//update_vore_belly_sprite()
|
||||
. = ..()
|
||||
if(vore_fullness_ex["stomach"] != previous_stomach_fullness)
|
||||
update_vore_belly_sprite()
|
||||
if(vore_fullness_ex["taur belly"] != previous_taur_fullness)
|
||||
update_vore_tail_sprite()
|
||||
|
||||
/mob/living/carbon/human/vs_animate(var/belly_to_animate)
|
||||
if(belly_to_animate == "stomach")
|
||||
vore_belly_animation()
|
||||
else if(belly_to_animate == "taur belly")
|
||||
vore_tail_animation()
|
||||
else
|
||||
return
|
||||
if(belly_to_animate == "stomach")
|
||||
vore_belly_animation()
|
||||
else if(belly_to_animate == "taur belly")
|
||||
vore_tail_animation()
|
||||
else
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/verb/hide_headset()
|
||||
set name = "Show/Hide Headset"
|
||||
set category = "IC"
|
||||
set desc = "Toggle headset worn icon visibility."
|
||||
hide_headset = !hide_headset
|
||||
update_inv_ears()
|
||||
@@ -9,3 +9,4 @@
|
||||
vore_icon_bellies = list("stomach", "taur belly")
|
||||
var/struggle_anim_stomach = FALSE
|
||||
var/struggle_anim_taur = FALSE
|
||||
var/hide_headset = FALSE
|
||||
@@ -1,2 +1,29 @@
|
||||
/datum/species/teshari
|
||||
vore_belly_default_variant = "T"
|
||||
vore_belly_default_variant = "T"
|
||||
|
||||
// allow teshari to always be scooped, as long as pref is enabled
|
||||
/mob/living/MouseDrop(var/atom/over_object)
|
||||
// make sure src (The dragged) is human
|
||||
if(!istype(src, /mob/living/carbon/human))
|
||||
return ..()
|
||||
|
||||
var/mob/living/carbon/human/DraggedH = src
|
||||
|
||||
//make sure src (the dragged) is a teshari
|
||||
if(DraggedH.species.name == SPECIES_TESHARI)
|
||||
var/mob/living/M = over_object
|
||||
// only perform the grab if; grabber and grabbed adjacent, caller is grabbed OR grabber, and the grabbed's grab preference is true.
|
||||
if(holder_type && istype(M) && Adjacent(M) && (usr == M || usr == DraggedH) && DraggedH != M && !M.incapacitated() && DraggedH.pickup_pref && (M != usr || (M == usr && M.pickup_active)) && (DraggedH.a_intent == I_HELP && M.a_intent == I_HELP)) //VOREStation Edit
|
||||
get_scooped(M, (usr == DraggedH))
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
//allow teshari permission to pass plastic flaps.
|
||||
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(istype(H))
|
||||
if(H.species.name == SPECIES_TESHARI)
|
||||
return 1
|
||||
|
||||
return ..()
|
||||
@@ -1,6 +1,7 @@
|
||||
/mob
|
||||
var/voice_freq = 42500 // Preference for character voice frequency
|
||||
var/list/voice_sounds_list = list() // The sound list containing our voice sounds!
|
||||
var/died_in_vr = FALSE //For virtual reality sleepers
|
||||
|
||||
/mob/is_incorporeal()
|
||||
if(incorporeal_move)
|
||||
|
||||
@@ -145,4 +145,22 @@
|
||||
name = "Sect Drone Eyes"
|
||||
icon_state = "sectdrone_eyes"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_HEAD)
|
||||
body_parts = list(BP_HEAD)
|
||||
|
||||
/datum/sprite_accessory/marking/ch/thickneck
|
||||
name = "Thick Neck"
|
||||
icon_state = "thickneck"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/thickerneck
|
||||
name = "Thicker Neck"
|
||||
icon_state = "thickerneck"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/thickthroat
|
||||
name = "Thick Throat"
|
||||
icon_state = "thickthroat"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
@@ -16,4 +16,14 @@
|
||||
name = "Fox (Taur, 3-color)"
|
||||
icon_state = "fox"
|
||||
extra_overlay = "fox_markings"
|
||||
extra_overlay2 = "fox_markings2"
|
||||
extra_overlay2 = "fox_markings2"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/sectdrone
|
||||
name = "Sect Drone (Taur)"
|
||||
icon_state = "sectdrone"
|
||||
extra_overlay = "sectdrone_markings"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/fatsectdrone
|
||||
name = "Fat Sect Drone (Taur)"
|
||||
icon_state = "fatsectdrone"
|
||||
extra_overlay = "fatsectdrone_markings"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
// prevent gun activation when stealth swimming. The low alpha hides you from NPC AI, which allows you to cheese mobs.
|
||||
/obj/item/weapon/gun/special_check(var/mob/user)
|
||||
var/mob/living/L = user
|
||||
if(istype(L))
|
||||
if(L.has_modifier_of_type(/datum/modifier/underwater_stealth))
|
||||
to_chat(user,"<span class='warning'>You cannot use guns whilst hiding underwater!</span>")
|
||||
return 0
|
||||
|
||||
return ..()
|
||||
@@ -23,9 +23,15 @@
|
||||
var/busy = FALSE
|
||||
var/production_mode = FALSE // Toggle between click-step input and comma-delineated text input for creating recipes.
|
||||
var/use_catalyst = TRUE // Determines whether or not the catalyst will be added to reagents while processing a recipe.
|
||||
var/stalled = FALSE // Required for emergency stop to interrupt on-going recipes.
|
||||
var/drug_substance = 1 // Controls which form medicine takes (bottle, pill, etc). 1 for bottle, 2 for pill, 3 for patch.
|
||||
var/delay_modifier = 4 // This is multiplied by the volume of a step to determine how long each step takes. Bigger volume = slower.
|
||||
var/obj/item/weapon/reagent_containers/glass/catalyst = null // This is where the user adds catalyst. Usually phoron.
|
||||
|
||||
var/bottle_icon = 4 // Determines icon states of bottles, pills, and patches.
|
||||
var/pill_icon = 2
|
||||
var/patch_icon = 2
|
||||
|
||||
var/list/recipes = list() // This holds chemical recipes up to a maximum determined by SYNTHESIZER_MAX_RECIPES. Two-dimensional.
|
||||
var/list/queue = list() // This holds the recipe id's for queued up recipes.
|
||||
var/list/catalyst_ids = list() // This keeps track of the chemicals in the catalyst to remove before bottling.
|
||||
@@ -264,6 +270,10 @@
|
||||
data["production_mode"] = production_mode
|
||||
data["panel_open"] = panel_open
|
||||
data["use_catalyst"] = use_catalyst
|
||||
data["drug_substance"] = drug_substance
|
||||
data["bottle_icon"] = bottle_icon
|
||||
data["pill_icon"] = pill_icon
|
||||
data["patch_icon"] = patch_icon
|
||||
|
||||
var/list/tmp_queue = list()
|
||||
for(var/i = 1, i <= queue.len, i++)
|
||||
@@ -304,12 +314,19 @@
|
||||
chemicals.Add(list(list("title" = label, "id" = label, "amount" = C.reagents.total_volume))) // list in a list because Byond merges the first list
|
||||
data["chemicals"] = chemicals
|
||||
|
||||
data["modal"] = tgui_modal_data(src)
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/chemical_synthesizer/tgui_act(action, params)
|
||||
/obj/machinery/chemical_synthesizer/tgui_act(action, params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
if(tgui_act_modal(action, params, ui, state))
|
||||
return TRUE
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("start_queue")
|
||||
@@ -347,7 +364,7 @@
|
||||
if(busy)
|
||||
var/confirm = alert(usr, "Are you sure you want to stall the machine?", "Confirm", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
stall()
|
||||
stalled = TRUE
|
||||
if("bottle_product")
|
||||
// Bottles the reaction mixture if stalled.
|
||||
if(!busy)
|
||||
@@ -391,8 +408,56 @@
|
||||
// If you forgot, this is a string returned by the user pressing the "add to queue" button on a recipe.
|
||||
if(index in recipes)
|
||||
queue[++queue.len] = index
|
||||
if("drug_form")
|
||||
// Toggles between bottles, pills, and patches.
|
||||
drug_substance = params["drug_index"]
|
||||
|
||||
add_fingerprint(usr)
|
||||
/obj/machinery/chemical_synthesizer/proc/tgui_act_modal(action, params, datum/tgui/ui, datum/tgui_state/state)
|
||||
. = TRUE
|
||||
var/id = params["id"] // The modal's ID
|
||||
var/list/arguments = istext(params["arguments"]) ? json_decode(params["arguments"]) : params["arguments"]
|
||||
switch(tgui_modal_act(src, action, params))
|
||||
if(TGUI_MODAL_OPEN)
|
||||
switch(id)
|
||||
if("change_pill_style")
|
||||
var/list/choices = list()
|
||||
for(var/i = 1 to MAX_PILL_SPRITE)
|
||||
choices += "pill[i].png"
|
||||
tgui_modal_bento(src, id, "Please select the new style for pills:", null, arguments, pill_icon, choices)
|
||||
if("change_patch_style")
|
||||
var/list/choices = list()
|
||||
for(var/i = 1 to MAX_PATCH_SPRITE)
|
||||
choices += "patch[i].png"
|
||||
tgui_modal_bento(src, id, "Please select the new style for patches:", null, arguments, patch_icon, choices)
|
||||
if("change_bottle_style")
|
||||
var/list/choices = list()
|
||||
for(var/i = 1 to MAX_BOTTLE_SPRITE)
|
||||
choices += "bottle-[i].png"
|
||||
tgui_modal_bento(src, id, "Please select the new style for bottles:", null, arguments, bottle_icon, choices)
|
||||
else
|
||||
return FALSE
|
||||
if(TGUI_MODAL_ANSWER)
|
||||
var/answer = params["answer"]
|
||||
switch(id)
|
||||
if("change_pill_style")
|
||||
var/new_style = CLAMP(text2num(answer) || 0, 0, MAX_PILL_SPRITE)
|
||||
if(!new_style)
|
||||
return
|
||||
pill_icon = new_style
|
||||
if("change_patch_style")
|
||||
var/new_style = CLAMP(text2num(answer) || 0, 0, MAX_PATCH_SPRITE)
|
||||
if(!new_style)
|
||||
return
|
||||
patch_icon = new_style
|
||||
if("change_bottle_style")
|
||||
var/new_style = CLAMP(text2num(answer) || 0, 0, MAX_BOTTLE_SPRITE)
|
||||
if(!new_style)
|
||||
return
|
||||
bottle_icon = new_style
|
||||
else
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/chemical_synthesizer/attack_ghost(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
@@ -482,6 +547,9 @@
|
||||
|
||||
// This proc handles adding the catalyst starting the synthesizer's queue.
|
||||
/obj/machinery/chemical_synthesizer/proc/start_queue(mob/user)
|
||||
if(stalled) // Incase SOMEHOW this var is true when the machine isn't running.
|
||||
stalled = FALSE
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
@@ -518,6 +586,11 @@
|
||||
|
||||
// This proc controls the timing for each step in a reaction. Step is the index for the current chem of our recipe, step + 1 is the volume of said chem.
|
||||
/obj/machinery/chemical_synthesizer/proc/follow_recipe(var/r_id, var/step as num)
|
||||
if(stalled) // Emergency stop if() check.
|
||||
stalled = FALSE
|
||||
stall()
|
||||
return
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
stall()
|
||||
return
|
||||
@@ -530,6 +603,11 @@
|
||||
|
||||
// This proc carries out the actual steps in each reaction.
|
||||
/obj/machinery/chemical_synthesizer/proc/perform_reaction(var/r_id, var/step as num)
|
||||
if(stalled) // Emergency stop if() check.
|
||||
stalled = FALSE
|
||||
stall()
|
||||
return
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
stall()
|
||||
return
|
||||
@@ -593,14 +671,41 @@
|
||||
if(!r_id)
|
||||
r_id = "[reagents.get_master_reagent_name()]"
|
||||
|
||||
while(reagents.total_volume)
|
||||
var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src.loc)
|
||||
B.name = "[r_id] bottle"
|
||||
B.pixel_x = rand(-7, 7) // random position
|
||||
B.pixel_y = rand(-7, 7)
|
||||
B.icon_state = "bottle-4"
|
||||
reagents.trans_to_obj(B, min(reagents.total_volume, MAX_UNITS_PER_BOTTLE))
|
||||
B.update_icon()
|
||||
// Copy-pasta go brr
|
||||
switch(drug_substance)
|
||||
if(2) // Pills
|
||||
while(reagents.total_volume)
|
||||
var/obj/item/weapon/reagent_containers/pill/P= new(src.loc)
|
||||
P.name = "[r_id]"
|
||||
P.pixel_x = rand(-7, 7) // random position
|
||||
P.pixel_y = rand(-7, 7)
|
||||
P.icon_state = "pill[pill_icon]"
|
||||
reagents.trans_to_obj(P, min(reagents.total_volume, MAX_UNITS_PER_PILL))
|
||||
if(P.icon_state in list("pill1", "pill2", "pill3", "pill4")) // if using greyscale, take colour from reagent
|
||||
P.color = P.reagents.get_color()
|
||||
P.update_icon()
|
||||
|
||||
if(3) // Patches
|
||||
while(reagents.total_volume)
|
||||
var/obj/item/weapon/reagent_containers/pill/patch/P= new(src.loc)
|
||||
P.name = "[r_id]"
|
||||
P.pixel_x = rand(-7, 7) // random position
|
||||
P.pixel_y = rand(-7, 7)
|
||||
P.icon_state = "patch[patch_icon]"
|
||||
reagents.trans_to_obj(P, min(reagents.total_volume, MAX_UNITS_PER_PATCH))
|
||||
if(P.icon_state in list("patch1", "patch2", "patch3", "patch4")) // if using greyscale, take colour from reagent
|
||||
P.color = P.reagents.get_color()
|
||||
P.update_icon()
|
||||
|
||||
else // Bottles. Official value is 1, but this works as a sanity check.
|
||||
while(reagents.total_volume)
|
||||
var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src.loc)
|
||||
B.name = "[r_id] bottle"
|
||||
B.pixel_x = rand(-7, 7) // random position
|
||||
B.pixel_y = rand(-7, 7)
|
||||
B.icon_state = "bottle-[bottle_icon]"
|
||||
reagents.trans_to_obj(B, min(reagents.total_volume, MAX_UNITS_PER_BOTTLE))
|
||||
B.update_icon()
|
||||
|
||||
// Sanity check when manual bottling is triggered.
|
||||
if(queue.len)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/machinery/shield_capacitor
|
||||
icon = 'modular_chomp/icons/obj/machines/shielding.dmi'
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/machinery/shield_gen
|
||||
icon = 'modular_chomp/icons/obj/machines/shielding.dmi'
|
||||
Reference in New Issue
Block a user