Merge branch 'master' into upstream-merge-14220

This commit is contained in:
Razgriz
2023-01-21 22:24:10 -07:00
committed by GitHub
475 changed files with 172406 additions and 165035 deletions
+2
View File
@@ -13,6 +13,8 @@
#define WEATHER_ASH_STORM "ash storm" // Ripped from TG, like the above. Less harmless.
#define WEATHER_ASH_STORM_SAFE "light ash storm" //Safe version of the ash storm. Dimmer.
#define WEATHER_FALLOUT "fallout" // Modified emberfall, actually harmful. Admin only.
#define WEATHER_FALLOUT_TEMP "short-term fallout" // Nuclear fallout that actually ends. Firework-only
#define WEATHER_CONFETTI "confetti" // Firework-only
#define MOON_PHASE_NEW_MOON "new moon"
#define MOON_PHASE_WAXING_CRESCENT "waxing crescent"
+94
View File
@@ -852,6 +852,100 @@ var/global/list/xenobio_rainbow_extracts = list(
/obj/item/slime_extract/rainbow = 1)
//// Wildlife lists
//Listed by-type. Under each type are lists of lists that contain 'groupings' of wildlife. Sorted from 1 to 5 by threat level.
var/global/list/event_wildlife_aquatic = list(
list(
list(/mob/living/simple_mob/animal/passive/fish/koi = 1,
/mob/living/simple_mob/animal/passive/fish/pike = 2,
/mob/living/simple_mob/animal/passive/fish/perch = 2,
/mob/living/simple_mob/animal/passive/fish/salmon = 2,
/mob/living/simple_mob/animal/passive/fish/trout = 2,
/mob/living/simple_mob/animal/passive/fish/bass = 3),
list(/mob/living/simple_mob/animal/passive/fish/salmon = 1),
list(/mob/living/simple_mob/animal/passive/fish/perch = 1),
list(/mob/living/simple_mob/animal/passive/fish/trout = 1),
list(/mob/living/simple_mob/animal/passive/fish/bass = 1),
list(/mob/living/simple_mob/animal/passive/fish/pike = 1),
list(/mob/living/simple_mob/animal/passive/crab = 1)
),
list(
list(/mob/living/simple_mob/animal/sif/duck = 1),
list(/mob/living/simple_mob/animal/passive/fish/measelshark = 1),
list(/mob/living/simple_mob/vore/pakkun = 5,
/mob/living/simple_mob/vore/pakkun/snapdragon = 1)
),
list(
list(/mob/living/simple_mob/animal/space/goose = 10,
/mob/living/simple_mob/animal/space/goose/white = 1),
list(/mob/living/simple_mob/vore/alienanimals/space_jellyfish = 1)
),
list(
list(/mob/living/simple_mob/animal/sif/hooligan_crab = 1)
)
)
var/global/list/event_wildlife_roaming = list(
list(
list(/mob/living/simple_mob/animal/passive/mouse/jerboa = 1,
/mob/living/simple_mob/animal/passive/mouse/black = 2,
/mob/living/simple_mob/animal/passive/mouse/brown = 2,
/mob/living/simple_mob/animal/passive/mouse/gray = 2,
/mob/living/simple_mob/animal/passive/mouse/white = 2,
/mob/living/simple_mob/animal/passive/mouse/rat = 3),
list(/mob/living/simple_mob/animal/passive/bird/black_bird = 1,
/mob/living/simple_mob/animal/passive/bird/azure_tit = 1,
/mob/living/simple_mob/animal/passive/bird/european_robin = 1,
/mob/living/simple_mob/animal/passive/bird/goldcrest = 1,
/mob/living/simple_mob/animal/passive/bird/ringneck_dove = 1),
list(/mob/living/simple_mob/animal/passive/dog/corgi = 4,
/mob/living/simple_mob/animal/passive/dog/corgi/puppy = 1),
list(/mob/living/simple_mob/vore/rabbit = 1),
list(/mob/living/simple_mob/vore/redpanda = 14,
/mob/living/simple_mob/vore/redpanda/fae = 7,
/mob/living/simple_mob/vore/redpanda/blue = 1),
list(/mob/living/simple_mob/animal/passive/cow = 1),
list(/mob/living/simple_mob/animal/passive/chicken = 4,
/mob/living/simple_mob/animal/passive/chick = 1),
list(/mob/living/simple_mob/animal/passive/snake = 2,
/mob/living/simple_mob/animal/passive/snake/red = 1,
/mob/living/simple_mob/animal/passive/snake/python = 1)
),
list(
list(/mob/living/simple_mob/vore/horse/big = 7,
/mob/living/simple_mob/vore/horse = 2),
list(/mob/living/simple_mob/vore/fennix = 1,
/mob/living/simple_mob/vore/fennec = 4),
list(/mob/living/simple_mob/vore/bee = 1),
list(/mob/living/simple_mob/animal/passive/fox = 1),
list(/mob/living/simple_mob/vore/sheep = 3,
/mob/living/simple_mob/animal/goat = 1),
list(/mob/living/simple_mob/vore/hippo = 1),
list(/mob/living/simple_mob/vore/alienanimals/dustjumper = 1),
list(/mob/living/simple_mob/vore/alienanimals/teppi = 1)
),
list(
list(/mob/living/simple_mob/vore/aggressive/frog = 1),
list(/mob/living/simple_mob/tomato = 1),
list(/mob/living/simple_mob/animal/wolf = 1),
list(/mob/living/simple_mob/vore/aggressive/dino = 1),
list(/mob/living/simple_mob/animal/space/bats = 1)
),
list(
list(/mob/living/simple_mob/animal/space/bear = 1),
list(/mob/living/simple_mob/vore/aggressive/deathclaw = 1),
list(/mob/living/simple_mob/otie = 1),
list(/mob/living/simple_mob/vore/aggressive/panther = 1),
list(/mob/living/simple_mob/vore/aggressive/rat = 1),
list(/mob/living/simple_mob/vore/aggressive/giant_snake = 1),
list(/mob/living/simple_mob/vore/aggressive/corrupthound = 1)
)
)
// AREA GENERATION AND BLUEPRINT STUFF BELOW HERE
// typecacheof(list) and list() are two completely separate things, don't break!
+1 -6
View File
@@ -140,12 +140,7 @@
return
// Cache this since S may go away after use()
var/list/sheet_matter
if(istype(S, /obj/item/stack/material))
var/obj/item/stack/material/MS = S
sheet_matter = list(MS.material.name = 2000)
else
sheet_matter = S.matter
var/list/sheet_matter = S.matter
// Calculate total amount of material for one sheet
var/matter_per_sheet = 0
+1 -1
View File
@@ -41,7 +41,7 @@ var/list/outfits_decls_by_type_
var/l_hand = null
// In the list(path=count,otherpath=count) format
var/list/uniform_accessories = list() // webbing, armbands etc - fits in slot_tie
var/list/backpack_contents = list()
var/list/backpack_contents = list()
var/id_type
var/id_desc
+1 -1
View File
@@ -74,7 +74,7 @@ var/global/list/security_printer_tickets = list() //VOREStation Edit
//VOREStation Add Start - Vore stats lets gooooo
if(GLOB.prey_eaten_roundstat > 0)
valid_stats_list.Add("A total of [GLOB.prey_eaten_roundstat] individuals were eaten today!")
valid_stats_list.Add("Individuals were eaten a total of [GLOB.prey_eaten_roundstat] times today!") //CHOMPEdit
if(GLOB.prey_digested_roundstat > 0)
valid_stats_list.Add("A total of [GLOB.prey_digested_roundstat] individuals were digested today!")
if(GLOB.prey_absorbed_roundstat > 0)
+2 -1
View File
@@ -153,6 +153,7 @@
containertype = /obj/structure/closet/crate/thinktronic
containername = "Holoplant crate"
/* CHOMPedit, moved to medical.dm in modular folder
/datum/supply_pack/misc/glucose_hypos
name = "Glucose Hypoinjectors"
contains = list(
@@ -161,7 +162,7 @@
cost = 25
containertype = /obj/structure/closet/crate/zenghu
containername = "Glucose Hypo Crate"
*/
/datum/supply_pack/misc/mre_rations
num_contained = 6
name = "Emergency - MREs"
+7
View File
@@ -176,3 +176,10 @@
access_pilot
)
one_access = TRUE
/datum/supply_pack/misc/swoopie //CHOMPAdd
name = "SWOOPIE XL CleanBot Kit"
contains = list()
cost = 100
containertype = /obj/structure/largecrate/animal/swoopie
containername = "SWOOPIE XL CleanBot Starter Kit"
+14 -12
View File
@@ -1,23 +1,25 @@
/datum/supply_pack/munitions/expeditionguns
name = "Frontier phaser (station-locked) crate"
/datum/supply_pack/munitions/expeditionguns //CHOMP Edit begin: Re-appropriating this whole block. Changing frontier phasers to phaseguns.
name = "Exploration phasegun (station-locked) crate"
contains = list(
/obj/item/weapon/gun/energy/locked/frontier = 2,
/obj/item/weapon/gun/energy/locked/frontier/holdout = 2,
/obj/item/weapon/gun/energy/locked/phasegun/pistol = 2,
/obj/item/weapon/gun/energy/locked/phasegun/rifle = 2,
/obj/item/weapon/gun/energy/locked/phasegun = 2
)
cost = 35
containertype = /obj/structure/closet/crate/secure
containername = "frontier phaser crate"
access = access_explorer //CHOMP explo keep
containername = "phasegun crate"
access = access_explorer
/datum/supply_pack/munitions/expeditionbows
name = "Frontier bows (station-locked) crate"
/datum/supply_pack/munitions/expeditioncannon
name = "Exploration phasecannon (station-locked) crate"
contains = list(
/obj/item/weapon/gun/energy/locked/frontier/handbow=2
/obj/item/weapon/gun/energy/locked/phasegun/cannon = 1
)
cost = 20
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "phaser handbow crate"
access = access_explorer //CHOMP explo keep
containername = "phasegun cannon crate"
access = access_explorer
//CHOMP Edit end
/datum/supply_pack/munitions/ofd_charge_emp
name = "OFD Charge - EMP"
@@ -114,3 +114,7 @@
/area/medical/cryo/autoresleeve
name = "\improper Medical Autoresleeving"
forbid_events = TRUE
/area/rnd/research/particleaccelerator
name = "\improper Particle Accelerator Lab"
icon_state = "toxlab"
+4 -3
View File
@@ -427,9 +427,10 @@ var/global/datum/controller/occupations/job_master
// Try desperately (and sorta poorly) to equip the item. Now with increased desperation!
if(G.slot && !(G.slot in custom_equip_slots))
var/metadata = H.client.prefs.gear[G.display_name]
if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
custom_equip_leftovers += thing
else if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
//if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
// custom_equip_leftovers += thing
//else
if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
to_chat(H, "<span class='notice'>Equipping you with \the [thing]!</span>")
if(G.slot != slot_tie)
custom_equip_slots.Add(G.slot)
+5 -5
View File
@@ -104,7 +104,7 @@
if(shocked)
shock(user, 50)
tgui_interact(user)
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
@@ -135,7 +135,7 @@
if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38) || istype (O,/obj/item/ammo_magazine/s44)/* VOREstation Edit*/) // Prevents ammo recycling exploit with speedloaders.
to_chat(user, "\The [O] is too hazardous to recycle with the autolathe!")
return
return ..()
/obj/machinery/autolathe/attack_hand(mob/user as mob)
@@ -177,12 +177,12 @@
max_sheets = 0
//Build list of multipliers for sheets.
multiplier = tgui_input_number(usr, "How many do you want to print? (0-[max_sheets])", null, null, max_sheets, 0)
if(!multiplier || multiplier <= 0 || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE)
if(!multiplier || multiplier <= 0 || (multiplier != round(multiplier)) || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE)
return FALSE
//Check if we still have the materials.
var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient
for(var/datum/material/used_material as anything in making.resources)
var/amount_needed = making.resources[used_material] * coeff * multiplier
materials_used[used_material] = amount_needed
@@ -190,7 +190,7 @@
if(LAZYLEN(materials_used))
if(!materials.has_materials(materials_used))
return
materials.use_materials(materials_used)
busy = making.name
-1
View File
@@ -7,7 +7,6 @@
/obj/machinery/telecomms/relay/preset/station
id = "Station Relay"
listening_level = 1
autolinkers = list("s_relay")
/obj/machinery/telecomms/relay/preset/telecomms
@@ -38,7 +38,7 @@
icon_state = "dirt"
mouse_opacity = 0
/obj/effect/decal/cleanable/Initialize(var/mapload, var/_age)
/obj/effect/decal/cleanable/dirt/Initialize(var/mapload, var/_age) //CHOMPEdit
.=..()
var/turf/simulated/our_turf = src.loc
if(our_turf && istype(our_turf) && our_turf.can_dirty && _age)
@@ -8,6 +8,10 @@
/obj/effect/landmark/vermin
name = "verminstart"
/obj/effect/landmark/wildlife
name = "wildlife"
var/wildlife_type = 2 //1 for water, 2 for land; thats all for now
/obj/effect/landmark/late_antag
name = "Antag Latespawn"
var/antag_id
+2 -2
View File
@@ -394,7 +394,7 @@ var/list/global/slot_flags_enumeration = list(
//If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen.
//Set disable_warning to 1 if you wish it to not give you outputs.
//Should probably move the bulk of this into mob code some time, as most of it is related to the definition of slots and not item-specific
/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = FALSE)
/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = FALSE, var/ignore_obstruction = FALSE)
if(!slot) return 0
if(!M) return 0
@@ -420,7 +420,7 @@ var/list/global/slot_flags_enumeration = list(
//Next check if the slot is accessible.
var/mob/_user = disable_warning? null : H
if(!H.slot_is_accessible(slot, src, _user))
if(!ignore_obstruction && !H.slot_is_accessible(slot, src, _user))
return 0
//Lastly, check special rules for the desired slot.
@@ -3,6 +3,7 @@
desc = "It prints security citations!"
icon = 'icons/obj/device_vr.dmi'
icon_state = "sec_ticket_printer"
slot_flags = SLOT_BELT | SLOT_HOLSTER
var/print_cooldown = 1 MINUTE
var/last_print
+8 -5
View File
@@ -240,7 +240,7 @@
//Return 1 if an immediate subsequent call to use() would succeed.
//Ensures that code dealing with stacks uses the same logic
/obj/item/stack/proc/can_use(var/used)
if(used < 0 || used % 1)
if(used < 0 || (used != round(used)))
stack_trace("Tried to use a bad stack amount: [used]")
return 0
if(get_amount() < used)
@@ -265,7 +265,7 @@
return 1
/obj/item/stack/proc/add(var/extra)
if(extra < 0 || extra % 1)
if(extra < 0 || (extra != round(extra)))
stack_trace("Tried to add a bad stack amount: [extra]")
return 0
if(!uses_charge)
@@ -283,7 +283,7 @@
S.add_charge(charge_costs[i] * extra)
/obj/item/stack/proc/set_amount(var/new_amount, var/no_limits = FALSE)
if(new_amount < 0 || new_amount % 1)
if(new_amount < 0 || (new_amount != round(new_amount)))
stack_trace("Tried to set a bad stack amount: [new_amount]")
return 0
@@ -321,7 +321,7 @@
if (isnull(tamount))
tamount = src.get_amount()
if(tamount < 0 || tamount % 1)
if(tamount < 0 || (tamount != round(tamount)))
stack_trace("Tried to transfer a bad stack amount: [tamount]")
return 0
@@ -347,7 +347,7 @@
if(uses_charge)
return null
if(tamount < 0 || tamount % 1)
if(tamount < 0 || (tamount != round(tamount)))
stack_trace("Tried to split a bad stack amount: [tamount]")
return null
@@ -403,6 +403,9 @@
/obj/item/stack/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
var/N = tgui_input_number(usr, "How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1, amount, 1)
if(N != round(N))
to_chat(user, "<span class='warning'>You cannot separate a non-whole number of stacks!</span>")
return
if(N)
var/obj/item/stack/F = src.split(N)
if (F)
+1 -1
View File
@@ -12,7 +12,7 @@
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.module.type == /obj/item/weapon/robot_module/robot/scrubpup) // You can now feed the trash borg yay.
if(R.module.type == /obj/item/weapon/robot_module/robot/janitor/scrubpup) // You can now feed the trash borg yay.
playsound(src,'sound/items/eatfood.ogg', rand(10,50), 1)
user.drop_item()
forceMove(R.vore_selected)
@@ -8,6 +8,7 @@
throwforce = 0
force = 0
action_button_name = "Command"
w_class = ITEMSIZE_SMALL //CHOMPEdit
var/active = FALSE //Is it set up?
var/mob/living/owner //Reference to the owner
@@ -854,4 +855,4 @@
/mob/living
var/capture_crystal = TRUE //If TRUE, the mob is capturable. Otherwise it isn't.
var/capture_caught = FALSE //If TRUE, the mob has already been caught, and so cannot be caught again.
var/capture_caught = FALSE //If TRUE, the mob has already been caught, and so cannot be caught again.
+1 -1
View File
@@ -56,7 +56,7 @@
else
user.visible_message("<span class='warning'>[user] begins to do [H]'s lips with \the [src].</span>", \
"<span class='notice'>You begin to apply \the [src].</span>")
if(do_after(user, 20) && do_after(H, 20, 5, 0)) //user needs to keep their active hand, H does not.
if(do_after(user, 20, H)) //user needs to keep their active hand, H does not.
user.visible_message("<span class='notice'>[user] does [H]'s lips with \the [src].</span>", \
"<span class='notice'>You apply \the [src].</span>")
H.lip_style = colour
@@ -56,10 +56,7 @@
to_chat(user, "<span class='notice'>You cut open the present.</span>")
for(var/mob/M in src) //Should only be one but whatever.
M.loc = src.loc
if (M.client)
M.client.eye = M.client.mob
M.client.perspective = MOB_PERSPECTIVE
M.forceMove(src.loc)
qdel(src)
@@ -180,11 +177,7 @@
var/obj/effect/spresent/present = new /obj/effect/spresent (H.loc)
src.amount -= 2
if (H.client)
H.client.perspective = EYE_PERSPECTIVE
H.client.eye = present
H.loc = present
H.forceMove(present)
add_attack_logs(user,H,"Wrapped with [src]")
else
@@ -15,6 +15,7 @@
show_messages = 0
allow_quick_empty = TRUE
use_sound = 'sound/items/drop/flesh.ogg'
var/egg_name = null //CHOMPAdd
/obj/item/weapon/storage/vore_egg/Initialize()
. = ..()
@@ -66,7 +66,7 @@
/obj/item/weapon/storage/pill_bottle/corophizine,
/obj/item/weapon/storage/pill_bottle/combat,
/obj/item/stack/medical/splint,
/obj/item/device/healthanalyzer/advanced
/obj/item/device/healthanalyzer/phasic
)
/obj/item/weapon/storage/firstaid/surgery
+3 -3
View File
@@ -16,7 +16,7 @@
for (var/obj/item/weapon/grab/G in H.grabbed_by)
if (G.loc == user && G.state >= GRAB_AGGRESSIVE)
return TRUE
return FALSE
/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
@@ -53,7 +53,7 @@
return
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s eyes!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses, ignore_obstructions = FALSE)
H.update_inv_glasses()
playsound(src, 'sound/effects/tape.ogg',25)
@@ -83,7 +83,7 @@
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s mouth!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask, ignore_obstructions = FALSE)
H.update_inv_wear_mask()
playsound(src, 'sound/effects/tape.ogg',25)
@@ -99,6 +99,7 @@
playsound(src, 'sound/items/change_jaws.ogg', 50, 1)
user.drop_item(src)
counterpart.forceMove(get_turf(src))
counterpart.persist_storable = persist_storable
src.forceMove(counterpart)
user.put_in_active_hand(counterpart)
to_chat(user, "<span class='notice'>You attach the cutting jaws to [src].</span>")
@@ -141,6 +141,7 @@
playsound(src,'sound/items/change_drill.ogg',50,1)
user.drop_item(src)
counterpart.forceMove(get_turf(src))
counterpart.persist_storable = persist_storable
src.forceMove(counterpart)
user.put_in_active_hand(counterpart)
to_chat(user, "<span class='notice'>You attach the bolt driver bit to [src].</span>")
@@ -126,6 +126,7 @@
playsound(src, 'sound/items/change_jaws.ogg', 50, 1)
user.drop_item(src)
counterpart.forceMove(get_turf(src))
counterpart.persist_storable = persist_storable
src.forceMove(counterpart)
user.put_in_active_hand(counterpart)
to_chat(user, "<span class='notice'>You attach the pry jaws to [src].</span>")
@@ -104,6 +104,7 @@
playsound(src,'sound/items/change_drill.ogg',50,1)
user.drop_item(src)
counterpart.forceMove(get_turf(src))
counterpart.persist_storable = persist_storable
src.forceMove(counterpart)
user.put_in_active_hand(counterpart)
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
@@ -41,11 +41,21 @@
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.opened)
if (istype(W, /obj/item/weapon/grab))
if(istype(W, /obj/item/weapon/storage/laundry_basket))
return ..(W,user)
if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
src.MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
if(large)
MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet
else
to_chat(user, "<span class='notice'>The locker is too small to stuff [G.affecting] into!</span>")
if(isrobot(user))
return
if(W.loc != user) // This should stop mounted modules ending up outside the module.
return
user.drop_item()
if (W) W.forceMove(src.loc)
if(W)
W.forceMove(loc)
else if(W.GetID())
var/obj/item/weapon/card/id/I = W.GetID()
@@ -161,7 +161,7 @@
update_state()
/obj/structure/door_assembly/attack_robot(mob/living/silicon/robot/user)
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering/general)) \
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering)) \
|| istype(user.module,/obj/item/weapon/robot_module/drone))) //Only dron (and engiborg) needs this.
rename_door(user)
@@ -1,3 +1,8 @@
/obj/structure/ghost_pod/proc/reset_ghostpod() //Makes the ghost pod usable again and re-adds it to the active ghost pod list if it is not on it.
active_ghost_pods |= src
used = FALSE
busy = FALSE
/obj/structure/ghost_pod/ghost_activated/maintpred
name = "maintenance hole"
desc = "Looks like some creature dug its way into station's maintenance..."
@@ -61,25 +66,26 @@
/obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M)
..()
var/choice
var/randomize
var/finalized = "No"
if(jobban_isbanned(M, "GhostRoles"))
to_chat(M, "<span class='warning'>You cannot inhabit this creature because you are banned from playing ghost roles.</span>")
reset_ghostpod()
return
while(finalized == "No" && M.client)
if(jobban_isbanned(M, "GhostRoles"))
to_chat(M, "<span class='warning'>You cannot inhabit this creature because you are banned from playing ghost roles.</span>")
return
choice = tgui_input_list(M, "What type of predator do you want to play as?", "Maintpred Choice", possible_mobs)
if(!choice)
// randomize = TRUE //CHOMP remove FUCK OFF. When I press cancel I expect to cancel.
used = FALSE //CHOMP add 200 IQ
busy = FALSE //CHOMP add 201 IQ
break
if(!choice) //We probably pushed the cancel button on the mob selection. Let's just put the ghost pod back in the list.
to_chat(M, "<span class='notice'>No mob selected, cancelling.</span>")
reset_ghostpod()
return
if(choice)
finalized = tgui_alert(M, "Are you sure you want to play as [choice]?","Confirmation",list("No","Yes"))
if(randomize)
choice = pick(possible_mobs)
if(!choice) //If somehow we ended up here and we don't have a choice, let's just reset things!
reset_ghostpod()
return
var/mobtype = possible_mobs[choice]
var/mob/living/simple_mob/newPred = new mobtype(get_turf(src))
+1 -1
View File
@@ -81,7 +81,7 @@
return
// Making windows, different per subtype
else if(istype(W, /obj/item/stack/material/glass))
else if(istype(W, /obj/item/stack/material/glass) || istype(W, /obj/item/stack/material/cyborg/glass))
handle_glass_use(user, W)
return
+3
View File
@@ -970,12 +970,15 @@
desc = "Flashy and pretty."
icon = 'icons/obj/christmas.dmi'
icon_state = "xmaslights"
layer = 4.9
plane = PLANE_LIGHTING_ABOVE
/obj/structure/sign/christmas/wreath
name = "wreath"
desc = "Prickly and festive."
icon = 'icons/obj/christmas.dmi'
icon_state = "doorwreath"
layer = 5
/obj/structure/sign/hostilefauna
icon = 'icons/obj/decals_vr.dmi'
@@ -9,8 +9,8 @@
buckle_lying = 0 //force people to sit up in chairs when buckled
var/propelled = 0 // Check for fire-extinguisher-driven chairs
/obj/structure/bed/chair/Initialize()
. = ..()
/obj/structure/bed/chair/New(var/newloc, var/new_material, var/new_padding_material)
..()
update_layer()
/obj/structure/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -113,44 +113,38 @@
I.color = padding_material.icon_colour
add_overlay(I)
/obj/structure/bed/chair/comfy/brown/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, MAT_LEATHER)
/obj/structure/bed/chair/comfy/brown/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, MAT_LEATHER)
/obj/structure/bed/chair/comfy/red/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "carpet")
/obj/structure/bed/chair/comfy/red/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "carpet")
/obj/structure/bed/chair/comfy/teal/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "teal")
/obj/structure/bed/chair/comfy/teal/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "teal")
/obj/structure/bed/chair/comfy/black/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "black")
/obj/structure/bed/chair/comfy/black/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "black")
/obj/structure/bed/chair/comfy/green/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "green")
/obj/structure/bed/chair/comfy/green/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "green")
/obj/structure/bed/chair/comfy/purp/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "purple")
/obj/structure/bed/chair/comfy/purp/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "purple")
/obj/structure/bed/chair/comfy/blue/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "blue")
/obj/structure/bed/chair/comfy/blue/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "blue")
/obj/structure/bed/chair/comfy/beige/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "beige")
/obj/structure/bed/chair/comfy/beige/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "beige")
/obj/structure/bed/chair/comfy/lime/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "lime")
/obj/structure/bed/chair/comfy/lime/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "lime")
/obj/structure/bed/chair/comfy/red/New(var/newloc,var/newmaterial)
..(newloc,"steel","carpet")
/obj/structure/bed/chair/comfy/yellow/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "yellow")
/obj/structure/bed/chair/comfy/teal/New(var/newloc,var/newmaterial)
..(newloc,"steel","teal")
/obj/structure/bed/chair/comfy/yellow/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "yellow")
/obj/structure/bed/chair/comfy/orange/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "orange")
/obj/structure/bed/chair/comfy/orange/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "orange")
/obj/structure/bed/chair/comfy/rounded
name = "rounded chair"
@@ -158,38 +152,38 @@
icon_state = "roundedchair"
base_icon = "roundedchair"
/obj/structure/bed/chair/comfy/rounded/brown/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, MAT_LEATHER)
/obj/structure/bed/chair/comfy/rounded/brown/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, MAT_LEATHER)
/obj/structure/bed/chair/comfy/rounded/red/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "carpet")
/obj/structure/bed/chair/comfy/rounded/red/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "carpet")
/obj/structure/bed/chair/comfy/rounded/teal/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "teal")
/obj/structure/bed/chair/comfy/rounded/teal/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "teal")
/obj/structure/bed/chair/comfy/rounded/black/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "black")
/obj/structure/bed/chair/comfy/rounded/black/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "black")
/obj/structure/bed/chair/comfy/rounded/green/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "green")
/obj/structure/bed/chair/comfy/rounded/green/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "green")
/obj/structure/bed/chair/comfy/rounded/purple/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "purple")
/obj/structure/bed/chair/comfy/rounded/purple/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "purple")
/obj/structure/bed/chair/comfy/rounded/blue/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "blue")
/obj/structure/bed/chair/comfy/rounded/blue/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "blue")
/obj/structure/bed/chair/comfy/rounded/beige/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "beige")
/obj/structure/bed/chair/comfy/rounded/beige/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "beige")
/obj/structure/bed/chair/comfy/rounded/lime/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "lime")
/obj/structure/bed/chair/comfy/rounded/lime/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "lime")
/obj/structure/bed/chair/comfy/rounded/yellow/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "yellow")
/obj/structure/bed/chair/comfy/rounded/yellow/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "yellow")
/obj/structure/bed/chair/comfy/rounded/orange/Initialize(var/ml,var/newmaterial)
. = ..(ml, MAT_STEEL, "orange")
/obj/structure/bed/chair/comfy/rounded/orange/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc, MAT_STEEL, "orange")
/obj/structure/bed/chair/office
anchored = FALSE
@@ -356,8 +350,8 @@
color = null
var/padding_color = "#CC0000"
/obj/structure/bed/chair/sofa/bench/Initialize()
. = ..()
/obj/structure/bed/chair/sofa/bench/New(var/newloc, var/new_material, var/new_padding_material)
..()
var/mutable_appearance/MA
// If we're north-facing, metal goes above mob, padding overlay goes below mob.
if((dir & NORTH) && !corner_piece)
@@ -25,8 +25,8 @@
base_icon = "modern_chair"
applies_material_colour = 0
/obj/structure/bed/chair/modern_chair/Initialize()
. = ..()
/obj/structure/bed/chair/modern_chair/New(var/newloc, var/new_material, var/new_padding_material)
..()
var/image/I = image(icon, "[base_icon]_over")
I.layer = ABOVE_MOB_LAYER
I.plane = MOB_PLANE
@@ -13,8 +13,8 @@
var/min_mob_buckle_size = MOB_SMALL
var/max_mob_buckle_size = MOB_LARGE
/obj/structure/bed/chair/wheelchair/Initialize()
. = ..()
/obj/structure/bed/chair/wheelchair/New(var/newloc, var/new_material, var/new_padding_material)
..()
update_icon()
/obj/structure/bed/chair/wheelchair/motor
@@ -76,7 +76,7 @@
update_state()
/obj/structure/windoor_assembly/attack_robot(mob/living/silicon/robot/user)
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering/general)) \
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering)) \
|| istype(user.module,/obj/item/weapon/robot_module/drone))) //Only dron (and engiborg) needs this.
rename_door(user)
+2 -2
View File
@@ -185,9 +185,9 @@
user.do_attack_animation(src)
shatter()
else if (usr.a_intent == I_HURT)
else if(usr && usr.a_intent == I_HURT) //CHOMPEdit
if (istype(usr,/mob/living/carbon/human))
if(istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(H.species.can_shred(H))
attack_generic(H,25)
+19 -1
View File
@@ -115,6 +115,8 @@ var/list/flooring_types
var/list/movable_atom_whitelist = list()
var/list/movable_atom_blacklist = list()
var/check_season = FALSE //VOREStation Addition
/decl/flooring/proc/get_plating_type(var/turf/T)
return plating_type
@@ -252,6 +254,12 @@ var/list/flooring_types
'sound/effects/footstep/snow4.ogg',
'sound/effects/footstep/snow5.ogg'))
/decl/flooring/snow/fake
desc = "A coating of fake snow, looks surprisingly realistic, though not as cold as the real thing."
icon = 'icons/turf/flooring/fakesnow.dmi'
icon_base = "snow"
flags = TURF_HAS_EDGES | TURF_HAS_CORNERS | TURF_REMOVE_SHOVEL
/decl/flooring/snow/snow2
name = "snow"
desc = "A layer of many tiny bits of frozen water. It's hard to tell how deep it is."
@@ -627,4 +635,14 @@ var/list/flooring_types
can_paint = 1 //VOREStation edit. Let's allow for some fun.
can_engrave = 1 //VOREStation edit. Fun.
flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_CROWBAR
///// Season Time! ///// VOREStation Addition Start
/decl/flooring/grass/seasonal_grass
desc = "It's grass!"
icon = 'icons/seasonal/turf.dmi'
check_season = TRUE
has_base_range = 11
/decl/flooring/grass/seasonal_grass/dark
name = "grass"
icon_base = "darkgrass"
@@ -489,6 +489,12 @@
initial_flooring = /decl/flooring/snow
var/list/crossed_dirs = list()
/turf/simulated/floor/fakesnow
name = "fake snow"
icon = 'icons/turf/outdoors.dmi'
icon_state = "snow"
initial_flooring = /decl/flooring/snow/fake
/turf/simulated/floor/snow/snow2
name = "snow"
icon = 'icons/turf/snow.dmi'
+257
View File
@@ -0,0 +1,257 @@
var/world_time_season
/proc/setup_season()
var/month = text2num(time2text(world.timeofday, "MM")) // get the current month
switch(month)
if(1 to 2)
world_time_season = "winter"
if(3 to 5)
world_time_season = "spring"
if(6 to 8)
world_time_season = "summer"
if(9 to 11)
world_time_season = "autumn"
if(12)
world_time_season = "winter"
/turf/simulated/floor/outdoors/grass/seasonal
name = "grass"
icon = 'icons/seasonal/turf.dmi'
icon_state = "s-grass"
icon_edge = 'icons/seasonal/turf_edge.dmi'
initial_flooring = /decl/flooring/grass/seasonal_grass
grass_types = list()
var/static/list/overlays_cache = list()
animal_chance = 0.5 // CHOMPedit: upstream redeclared these as new vars for some reason
animal_types = list() // CHOMPedit end
var/tree_chance = 1
var/tree_types = list()
var/snow_chance = 10
/turf/simulated/floor/outdoors/grass/seasonal/Initialize()
switch(world_time_season)
if("spring")
tree_types = list(
/obj/structure/flora/tree/bigtree,
/obj/structure/flora/tree/jungle_small,
/obj/structure/flora/tree/jungle
)
animal_types = list(
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
/mob/living/simple_mob/vore/redpanda = 40,
/mob/living/simple_mob/vore/redpanda/fae = 2,
/mob/living/simple_mob/vore/sheep = 20,
/mob/living/simple_mob/vore/rabbit/black = 20,
/mob/living/simple_mob/vore/rabbit/white = 20,
/mob/living/simple_mob/vore/rabbit/brown = 20,
/mob/living/simple_mob/vore/leopardmander = 2,
/mob/living/simple_mob/vore/horse/big = 10,
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
)
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/brflowers,
/obj/structure/flora/ausbushes/genericbush,
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/ausbushes/leafybush,
/obj/structure/flora/ausbushes/ppflowers,
/obj/structure/flora/ausbushes/sunnybush,
/obj/structure/flora/ausbushes/ywflowers,
/obj/structure/flora/mushroom
)
grass_chance = 30
if("summer")
tree_types = list(
/obj/structure/flora/tree/bigtree,
/obj/structure/flora/tree/jungle_small,
/obj/structure/flora/tree/jungle
)
animal_types = list(
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
/mob/living/simple_mob/vore/redpanda = 40,
/mob/living/simple_mob/vore/redpanda/fae = 2,
/mob/living/simple_mob/vore/sheep = 20,
/mob/living/simple_mob/vore/rabbit/black = 20,
/mob/living/simple_mob/vore/rabbit/white = 20,
/mob/living/simple_mob/vore/rabbit/brown = 20,
/mob/living/simple_mob/vore/leopardmander = 2,
/mob/living/simple_mob/vore/horse/big = 10,
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
)
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
/obj/structure/flora/ausbushes/fullgrass
)
if("autumn")
tree_types = list(
/obj/structure/flora/tree/bigtree
)
animal_types = list(
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
/mob/living/simple_mob/vore/redpanda = 40,
/mob/living/simple_mob/vore/redpanda/fae = 2,
/mob/living/simple_mob/vore/sheep = 20,
/mob/living/simple_mob/vore/rabbit/black = 20,
/mob/living/simple_mob/vore/rabbit/white = 20,
/mob/living/simple_mob/vore/rabbit/brown = 20,
/mob/living/simple_mob/vore/horse/big = 10,
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
)
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass,
/obj/structure/flora/pumpkin,
/obj/structure/flora/ausbushes
)
grass_chance = 10
animal_chance = 0.25
if("winter")
grass_chance = 0
tree_types = list(
/obj/structure/flora/tree/dead,
/obj/structure/flora/tree/pine
)
animal_types = list(
/mob/living/simple_mob/vore/rabbit/white = 40,
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
/mob/living/simple_mob/vore/redpanda = 10
)
if(prob(snow_chance))
chill()
return
grass_types = list(
/obj/structure/flora/grass/both,
/obj/structure/flora/grass/brown,
/obj/structure/flora/grass/green,
/obj/structure/flora/bush
)
grass_chance = 1
animal_chance = 0.1
if(tree_chance && prob(tree_chance) && !check_density())
var/tree_type = pickweight(tree_types)
new tree_type(src)
if(animal_chance && prob(animal_chance) && !check_density())
var/animal_type = pickweight(animal_types)
new animal_type(src)
. = ..()
/turf/simulated/floor/outdoors/grass/seasonal/proc/update_desc()
switch(world_time_season)
if("spring")
desc = "Lush green grass, flourishing! Little flowers peek out from between the blades here and there!"
if("summer")
desc = "Bright green grass, a little dry in the summer heat!"
if("autumn")
desc = "Golden grass, it's a little crunchy as it prepares for winter!"
if("winter")
desc = "Dry, seemingly dead grass! It's too cold for the grass..."
/turf/simulated/floor/outdoors/grass/seasonal/update_icon(update_neighbors)
. = ..()
update_desc()
switch(world_time_season)
if("spring")
if(prob(50))
var/cache_key = "[world_time_season]-overlay[rand(1,19)]"
if(!overlays_cache[cache_key])
var/image/I = image(icon = src.icon, icon_state = cache_key, layer = ABOVE_TURF_LAYER) // Icon should be abstracted out
I.plane = TURF_PLANE
I.color = null
I.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE
overlays_cache[cache_key] = I
add_overlay(overlays_cache[cache_key])
if("summer")
return
if("autumn")
if(prob(33))
var/cache_key = "[world_time_season]-overlay[rand(1,6)]"
if(!overlays_cache[cache_key])
var/image/I = image(icon = src.icon, icon_state = cache_key, layer = ABOVE_TURF_LAYER) // Icon should be abstracted out
I.plane = TURF_PLANE
I.color = null
I.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE
overlays_cache[cache_key] = I
add_overlay(overlays_cache[cache_key])
if("winter")
return
/turf/simulated/floor/outdoors/grass/seasonal/notrees
tree_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/nomobs
animal_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs
tree_chance = 0
animal_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow
tree_chance = 0
animal_chance = 0
snow_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow
tree_chance = 0
animal_chance = 0
snow_chance = 1
/turf/simulated/floor/outdoors/grass/seasonal/lowsnow
snow_chance = 1
/turf/simulated/floor/outdoors/grass/seasonal/dark
icon_state = "ds-grass"
edge_blending_priority = 4.01
initial_flooring = /decl/flooring/grass/seasonal_grass/dark
tree_chance = 5
/turf/simulated/floor/outdoors/grass/seasonal/dark/notrees
tree_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/dark/nomobs
animal_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/dark/notrees_nomobs
tree_chance = 0
animal_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/dark/notrees_nomobs_nosnow
tree_chance = 0
animal_chance = 0
snow_chance = 0
/turf/simulated/floor/outdoors/grass/seasonal/dark/notrees_nomobs_lowsnow
tree_chance = 0
animal_chance = 0
snow_chance = 1
/turf/simulated/floor/outdoors/grass/seasonal/dark/lowsnow
snow_chance = 1
/turf/simulated/floor/water/seasonal/Initialize()
. = ..()
switch(world_time_season)
if("winter")
if(prob(99))
ChangeTurf(/turf/simulated/floor/outdoors/ice)
/turf/simulated/floor/water/deep/seasonal/Initialize()
. = ..()
switch(world_time_season)
if("winter")
if(prob(75))
ChangeTurf(/turf/simulated/floor/outdoors/ice)
+2
View File
@@ -18,6 +18,8 @@
var/dirt = 0
var/special_temperature //Used for turf HE-Pipe interaction
var/icon_edge = 'icons/turf/outdoors_edge.dmi' //VOREStation Addition - Allows for alternative edge icon files
// This is not great.
/turf/simulated/proc/wet_floor(var/wet_val = 1)
if(wet > 2) //Can't mop up ice
+5 -3
View File
@@ -23,6 +23,9 @@ var/image/no_ceiling_image = null
icon_state = flooring_override
else
icon_state = flooring.icon_base
//VOREStation Addition Start
if(flooring.check_season)
icon_state = "[icon_state]-[world_time_season]" //VOREStation Addition End
if(flooring.has_base_range)
icon_state = "[icon_state][rand(0,flooring.has_base_range)]"
flooring_override = icon_state
@@ -107,11 +110,11 @@ var/image/no_ceiling_image = null
// Has to have it's own edge_blending_priority
// Has to have a higher priority than us
// Their icon_state is not our icon_state
// They don't forbid_turf_edge
// They don't forbid_turf_edge
if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state && !T.forbid_turf_edge())
var/cache_key = "[T.get_edge_icon_state()]-[checkdir]" // Usually [icon_state]-[dirnum]
if(!turf_edge_cache[cache_key])
var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER) // Icon should be abstracted out
var/image/I = image(icon = T.icon_edge, icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER) // VOREStation Edit - icon_edge
I.plane = TURF_PLANE
turf_edge_cache[cache_key] = I
add_overlay(turf_edge_cache[cache_key])
@@ -282,4 +285,3 @@ var/image/no_ceiling_image = null
I.layer = layer
flooring_cache[cache_key] = I
return flooring_cache[cache_key]
@@ -79,3 +79,4 @@
icon_state = "ice"
desc = "Looks slippery."
movement_cost = 4
edge_blending_priority = 0
+1
View File
@@ -39,6 +39,7 @@
//end-emergency fix
src.update_status()
setup_season() //VOREStation Addition
. = ..()
+2 -2
View File
@@ -741,7 +741,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/toggleooc()
set category = "Server"
set desc="Globally Toggles OOC"
set name="Toggle OOC"
set name="Toggle Player OOC"
if(!check_rights(R_ADMIN))
return
@@ -757,7 +757,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/togglelooc()
set category = "Server"
set desc="Globally Toggles LOOC"
set name="Toggle LOOC"
set name="Toggle Player LOOC"
if(!check_rights(R_ADMIN))
return
+15
View File
@@ -652,6 +652,21 @@
message_admins(log)
log_admin(log)
/datum/admins/proc/toggle_firework_override()
set category = "Fun"
set name = "Toggle Weather Firework Override"
set desc = "Toggles ability for weather fireworks to affect weather on planet of choice."
if(!check_rights(R_DEBUG))
return
var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to toggle firework effects on?", "Change Weather", SSplanets.planets)
if(istype(planet) && planet.weather_holder)
planet.weather_holder.firework_override = !(planet.weather_holder.firework_override)
var/log = "[key_name(src)] toggled [planet.name]'s firework override to [planet.weather_holder.firework_override ? "on" : "off"]."
message_admins(log)
log_admin(log)
/datum/admins/proc/change_time()
set category = "Debug"
set name = "Change Planet Time"
+1 -1
View File
@@ -130,7 +130,7 @@
if(SMITE_AD_SPAM)
if(target.client)
create_fake_ad_popup_multiple(/obj/screen/popup/default, 15)
target.client.create_fake_ad_popup_multiple(/obj/screen/popup/default, 15)
else
return //Injection? Don't print any messages.
-22
View File
@@ -15,7 +15,6 @@
var/airlock_wire = null
var/datum/wires/connected = null
var/datum/radio_frequency/radio_connection
var/deadman = FALSE
/obj/item/device/assembly/signaler/Initialize()
. = ..()
@@ -131,27 +130,6 @@
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
/obj/item/device/assembly/signaler/process()
if(!deadman)
STOP_PROCESSING(SSobj, src)
var/mob/M = src.loc
if(!M || !ismob(M))
if(prob(5))
signal()
deadman = FALSE
STOP_PROCESSING(SSobj, src)
else if(prob(5))
M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!")
/obj/item/device/assembly/signaler/verb/deadman_it()
set src in usr
set name = "Threaten to push the button!"
set desc = "BOOOOM!"
deadman = TRUE
START_PROCESSING(SSobj, src)
log_and_message_admins("is threatening to trigger a signaler deadman's switch")
usr.visible_message("<font color='red'>[usr] moves their finger over [src]'s signal button...</font>")
/obj/item/device/assembly/signaler/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
@@ -405,14 +405,17 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/obj/item/organ/external/O = character.organs_by_name[N]
O.markings.Cut()
var/priority = 0
for(var/M in pref.body_markings)
priority += 1
var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[M]
var/mark_color = "[pref.body_markings[M]]"
for(var/BP in mark_datum.body_parts)
var/obj/item/organ/external/O = character.organs_by_name[BP]
if(O)
O.markings[M] = list("color" = mark_color, "datum" = mark_datum)
O.markings[M] = list("color" = mark_color, "datum" = mark_datum, "priority" = priority)
character.markings_len = priority
var/list/last_descriptors = list()
if(islist(pref.body_descriptors))
@@ -126,6 +126,14 @@
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/head/halo
display_name = "halo (colorable)"
path = /obj/item/clothing/head/halo
/datum/gear/head/halo/New()
..()
gear_tweaks += gear_tweak_free_color_choice
/datum/gear/head/cap/mbill
display_name = "cap, major bill's"
path = /obj/item/clothing/head/soft/mbill
@@ -436,4 +444,4 @@
/datum/gear/head/wheat
display_name = "straw hat"
path = /obj/item/clothing/head/wheat
path = /obj/item/clothing/head/wheat
@@ -137,6 +137,7 @@ Talon winter coat
path = /obj/item/clothing/suit/storage/hooded/hoodie
/datum/gear/suit/hoodie_vr/New()
..()
var/list/hoodies = list()
for(var/hoodie_style in typesof(/obj/item/clothing/suit/storage/hooded/hoodie))
var/obj/item/clothing/suit/storage/toggle/hoodie/hoodie = hoodie_style
+6 -1
View File
@@ -10,6 +10,11 @@
desc = "A formal hat for SolGov Customs Officers."
icon_state = "customshat"
/obj/item/clothing/head/halo
name = "halo"
desc = "a small metal ring, floating above it's wearer."
icon_state = "halo"
/obj/item/clothing/head/pin
icon_state = "pin"
addblends = "pin_a"
@@ -552,4 +557,4 @@
desc = "Reputed to go faster."
icon_state = "redtag"
flags_inv = HIDEEARS|BLOCKHEADHAIR
body_parts_covered = HEAD|EYES
body_parts_covered = HEAD|EYES
@@ -92,13 +92,13 @@
//Orange emergency space suit
/obj/item/clothing/head/helmet/space/emergency
name = "Emergency Space Helmet"
name = "emergency soft helmet"
icon_state = "syndicate-helm-orange"
desc = "A simple helmet with a built in light, smells like mothballs."
flash_protection = FLASH_PROTECTION_NONE
/obj/item/clothing/suit/space/emergency
name = "Emergency Softsuit"
name = "emergency softsuit"
icon_state = "syndicate-orange"
desc = "A thin, ungainly softsuit colored in blaze orange for rescuers to easily locate, looks pretty fragile."
slowdown = 2
+1 -1
View File
@@ -86,7 +86,7 @@
..()
return
var/obj/item/stack/cable_coil/CC = new (user.loc)
var/obj/item/stack/cable_coil/CC = new (user.loc, 1)
CC.update_icon()
cut_overlays()
string_attached = null
+2 -2
View File
@@ -284,7 +284,7 @@
/obj/item/weapon/reagent_containers/food/snacks/fruitbar = 16,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 8,
/obj/item/weapon/reagent_containers/pill/diet = 8,
///obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5, //VOREStation Removal,
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5, //VOREStation Removal, //CHOMPedit nah
/obj/item/weapon/towel/random = 8,
/obj/item/toy/tennis = 4)
@@ -296,7 +296,7 @@
/obj/item/weapon/reagent_containers/food/snacks/fruitbar = 5,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 5,
/obj/item/weapon/reagent_containers/pill/diet = 25,
///obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5,
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5, //CHOMPedit nah
/obj/item/weapon/towel/random = 20,
/obj/item/toy/tennis = 15)
//VOREStation Edit End
@@ -41,7 +41,7 @@
emote_sound = 'sound/voice/biamthelaw.ogg'
/decl/emote/audible/synth/security/mob_can_use(var/mob/living/silicon/robot/user)
return ..() && (istype(user) && (istype(user.module, /obj/item/weapon/robot_module/robot/security) || istype(user.module, /obj/item/weapon/robot_module/robot/knine))) //VOREStation Add - knine module
return ..() && (istype(user) && (istype(user.module, /obj/item/weapon/robot_module/robot/security)))
/decl/emote/audible/synth/security/halt
key = "halt"
+2 -2
View File
@@ -140,8 +140,8 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Spiders", /datum/event/spider_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
//YW Change new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
//YW Change new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
+4
View File
@@ -208,6 +208,10 @@ var/list/event_last_fired = list()
active_with_role["Medical"]++
else if(istype(R.module, /obj/item/weapon/robot_module/robot/research))
active_with_role["Scientist"]++
else if(istype(R.module, /obj/item/weapon/robot_module/robot/janitor))
active_with_role["Janitor"]++
else if(istype(R.module, /obj/item/weapon/robot_module/robot/clerical/butler))
active_with_role["Botanist"]++
if(M.mind.assigned_role in SSjob.get_job_titles_in_department(DEPARTMENT_ENGINEERING))
active_with_role["Engineer"]++
+71
View File
@@ -0,0 +1,71 @@
/datum/event/roaming_wildlife
announceWhen = 10
/datum/event/roaming_wildlife/start()
var/list/possible_spawns = list()
for(var/obj/effect/landmark/C in landmarks_list)
if(istype(C, /obj/effect/landmark/wildlife))
var/obj/effect/landmark/wildlife/WLLM = C
if(world_time_season == "winter" && WLLM.wildlife_type == 1) //fish forbidden in winter because ice now aparently
continue
possible_spawns.Add(C)
if(!(possible_spawns.len))
return
var/threat_level
var/spawn_count
var/location_amount
var/points_to_spend
switch(severity)
if(EVENT_LEVEL_MUNDANE)
points_to_spend = 6
if(EVENT_LEVEL_MODERATE)
points_to_spend = 10
if(EVENT_LEVEL_MAJOR)
points_to_spend = 14
if(!points_to_spend)
return
threat_level = rand(1,4)
points_to_spend -= threat_level
spawn_count = rand(1, min(points_to_spend-1, 9))
points_to_spend -= spawn_count
location_amount = points_to_spend
for(var/i = 1, i <= location_amount, i++)
if(!(possible_spawns.len))
break
var/obj/effect/landmark/wildlife/WL = pick(possible_spawns)
possible_spawns -= WL
var/list/spawn_list
switch(WL.wildlife_type)
if(1)
spawn_list = event_wildlife_aquatic
if(2)
spawn_list = event_wildlife_roaming
if(!spawn_list)
continue
spawn_list = pick(spawn_list[threat_level])
var/spawn_type
var/spawn_pos = get_turf(WL)
for(var/j = 1, j <= spawn_count, j++)
spawn_type = pickweight(spawn_list)
var/mob/living/L = new spawn_type(spawn_pos)
step_away(L, WL)
/datum/event/roaming_wildlife/announce()
var/message
switch(severity)
if(EVENT_LEVEL_MUNDANE)
message = "Minor movements of local wildlife have been detected within proximity of the facility."
if(EVENT_LEVEL_MODERATE)
message = "Notable amount of local wildlife has been detected entering area surrounding the facility. Take caution."
if(EVENT_LEVEL_MAJOR)
message = "A particularly large shift within wildlife movement has been detected. Take caution."
command_announcement.Announce(message, "Wildlife Monitoring")
+124
View File
@@ -0,0 +1,124 @@
/obj/machinery/firework_launcher
name = "firework launcher"
desc = "A machine for launching fireworks of varying practicality."
icon = 'icons/obj/machines/firework_launcher.dmi'
icon_state = "launcher01"
density = TRUE
anchored = TRUE
circuit = /obj/item/weapon/circuitboard/firework_launcher
var/obj/item/weapon/firework_star/loaded_star
var/last_launch
var/launch_cooldown = 5 MINUTES
/obj/machinery/firework_launcher/Initialize()
. = ..()
default_apply_parts()
last_launch = world.time // Prevents cheesing cooldown by deconstructing and reconstructing
update_icon()
/obj/machinery/firework_launcher/RefreshParts()
launch_cooldown = 5 MINUTES
var/rating = 0
for(var/obj/item/weapon/stock_parts/micro_laser/laser in component_parts)
rating += laser.rating - 1
launch_cooldown = max(0, (launch_cooldown - ((rating*30) SECONDS))) // For every part tier above 1 on the two lasers, reduce cooldown by 30 seconds. 1 minute cooldown on the tier 5 parts, 3 minutes on tier 3.
. = ..()
/obj/machinery/firework_launcher/update_icon()
icon_state = "launcher[loaded_star ? "1" : "0"][anchored ? "1" : "0"][panel_open ? "_open" : ""]"
/obj/machinery/firework_launcher/attackby(var/obj/item/O, var/mob/user)
if(default_deconstruction_screwdriver(user, O))
update_icon()
return
if(default_deconstruction_crowbar(user, O))
return
if(default_part_replacement(user, O))
return
if(default_unfasten_wrench(user, O, 20))
update_icon()
return
if(istype(O, /obj/item/weapon/firework_star))
loaded_star = O
user.drop_item()
O.forceMove(src)
to_chat(user, "<span class='notice'>You insert the firework star into the launcher.</span>")
add_fingerprint(user)
update_icon()
return
return ..()
/obj/machinery/firework_launcher/verb/eject()
set category = "Object"
set name = "Eject Firework Star"
set src in oview(1)
var/mob/living/user = usr
if(!user || user.stat != 0)
return
if(!loaded_star)
to_chat(user, "<span class='notice'>There is no firework star loaded in the launcher.</span>")
return
else
loaded_star.forceMove(get_turf(src))
loaded_star = null
add_fingerprint(user)
update_icon()
/obj/machinery/firework_launcher/attack_hand(mob/user) // Maybe this proc could be better as entirely its own proc, called from attack_hand, but also I don't really see the point
if(panel_open)
to_chat(user, "<span class='warning'>Close the panel first!</span>")
return
if(!loaded_star)
to_chat(user, "<span class='notice'>There is no firework star loaded in the launcher.</span>")
return
if((world.time - last_launch) <= launch_cooldown)
to_chat(user, "<span class='notice'>The launcher is still re-priming for launch.</span>")
return
if(!anchored)
to_chat(user, "<span class='warning'>Launcher must be firmly secured to the ground before firework can be launched!</span>")
return
var/datum/planet/P = get_planet()
if(!P || !(P.weather_holder)) // There are potential cases of being outside but not on planet. And checking whether planet has weather at all is more sanity thing than anything.
to_chat(user, "<span class='warning'>Launcher beeps as its safeties seem to prevent launch in the current location.</span>")
return
var/datum/weather_holder/WH = P.weather_holder
if(WH.firework_override && istype(loaded_star, /obj/item/weapon/firework_star/weather)) // Enable weather-based events to not be ruined
to_chat(user, "<span class='warning'>Launcher beeps as it seems some interference is preventing launch of this type of firework.</span>")
return
to_chat(user, "<span class='notice'>You launch the firework!</span>")
playsound(get_turf(src), 'sound/weapons/rpg.ogg', 75, 1)
loaded_star.trigger_firework(WH)
qdel(loaded_star)
loaded_star = null
last_launch = world.time
add_fingerprint(user)
update_icon()
flick("launcher_launch", src)
/obj/machinery/firework_launcher/proc/get_planet()
var/turf/T = get_turf(src)
if(!T)
return
if(!T.is_outdoors())
return
var/datum/planet/P = SSplanets.z_to_planet[T.z]
if(!P)
return
return P
+142
View File
@@ -0,0 +1,142 @@
#define T_FIREWORK_WEATHER_STAR(name) "weather firework star (" + (name) + ")"
/obj/item/weapon/firework_star
icon = 'icons/obj/firework_stars.dmi'
name = "firework star"
desc = "A very tightly compacted ball of chemicals for use with firework launcher."
icon_state = "star"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 1)
/obj/item/weapon/firework_star/proc/trigger_firework(var/datum/weather_holder/w_holder)
return
/obj/item/weapon/firework_star/weather
name = "weather firework star"
desc = "A firework star designed to alter a weather, rather than put on a show."
var/weather_type
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 2)
/obj/item/weapon/firework_star/weather/trigger_firework(var/datum/weather_holder/w_holder)
if(!w_holder) // Sanity
return
if(w_holder.firework_override) // Make sure weather-based events can't be interfered with
return
if(weather_type && (weather_type in w_holder.allowed_weather_types))
w_holder.message_all_outdoor_players("Something seems to flash in the sky, as weather suddenly shifts!")
w_holder.change_weather(weather_type)
w_holder.rebuild_forecast()
/obj/item/weapon/firework_star/weather/clear
name = T_FIREWORK_WEATHER_STAR("CLEAR SKY")
weather_type = WEATHER_CLEAR
icon_state = "clear"
/obj/item/weapon/firework_star/weather/overcast
name = T_FIREWORK_WEATHER_STAR("CLOUDY")
weather_type = WEATHER_OVERCAST
icon_state = "cloudy"
/obj/item/weapon/firework_star/weather/rain
name = T_FIREWORK_WEATHER_STAR("RAIN")
weather_type = WEATHER_RAIN
icon_state = "rain"
/obj/item/weapon/firework_star/weather/storm
name = T_FIREWORK_WEATHER_STAR("STORM")
weather_type = WEATHER_STORM
icon_state = "rain"
/obj/item/weapon/firework_star/weather/light_snow
name = T_FIREWORK_WEATHER_STAR("SNOW - LIGHT")
weather_type = WEATHER_LIGHT_SNOW
icon_state = "snow"
/obj/item/weapon/firework_star/weather/snow
name = T_FIREWORK_WEATHER_STAR("SNOW - MEDIUM")
weather_type = WEATHER_SNOW
icon_state = "snow"
/obj/item/weapon/firework_star/weather/blizzard
name = T_FIREWORK_WEATHER_STAR("SNOW - HEAVY")
weather_type = WEATHER_BLIZZARD
icon_state = "snow"
/obj/item/weapon/firework_star/weather/hail
name = T_FIREWORK_WEATHER_STAR("HAIL")
weather_type = WEATHER_HAIL
icon_state = "snow"
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 2, TECH_ILLEGAL = 1)
/obj/item/weapon/firework_star/weather/fallout
name = T_FIREWORK_WEATHER_STAR("NUCLEAR")
desc = "This is the worst idea ever."
weather_type = WEATHER_FALLOUT_TEMP
icon_state = "nuclear"
origin_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 3, TECH_ILLEGAL = 5)
/obj/item/weapon/firework_star/weather/confetti
name = T_FIREWORK_WEATHER_STAR("CONFETTI")
desc = "A firework star designed to alter a weather, rather than put on a show. This one makes colorful confetti rain from the sky."
weather_type = WEATHER_CONFETTI
icon_state = "confetti"
/obj/item/weapon/firework_star/aesthetic
name = "aesthetic firework star"
desc = "A firework star designed to paint the sky with pretty lights."
var/list/firework_adjectives = list("beautiful", "pretty", "fancy", "colorful", "bright", "shimmering")
var/list/firework_colors = list("red", "orange", "yellow", "green", "cyan", "blue", "purple", "pink", "beige", "white")
/obj/item/weapon/firework_star/aesthetic/trigger_firework(var/datum/weather_holder/w_holder)
if(!w_holder)
return
w_holder.message_all_outdoor_players(get_firework_message())
/obj/item/weapon/firework_star/aesthetic/proc/get_firework_message()
return "You see a [pick(firework_adjectives)] explosion of [pick(firework_colors)] sparks in the sky!"
/obj/item/weapon/firework_star/aesthetic/configurable
name = "configurable aesthetic firework star"
desc = "A firework star designed to paint the sky with pretty lights. This one's advanced and can be configured to specific shapes or colors."
icon_state = "config"
var/current_color = "white"
var/current_shape = "Random"
var/list/firework_shapes = list("none", "Random",
"a circle", "an oval", "a triangle", "a square", "a pentagon", "a hexagon", "an octagon", "a plus sign", "an x", "a star", "a spiral", "a heart", "a teardrop",
"a smiling face", "a winking face", "a mouse", "a cat", "a dog", "a fox", "a bird", "a fish", "a lizard", "a bug", "a butterfly", "a robot", "a dragon", "a teppi", "a catslug",
"a tree", "a leaf", "a flower", "a lightning bolt", "a cloud", "a sun", "a gemstone", "a flame", "a wrench", "a beaker", "a syringe", "a pickaxe", "a pair of handcuffs", "a crown",
"a bottle", "a boat", "a spaceship",
"Nanotrasen logo", "a geometric-looking letter S", "a dodecahedron")
/obj/item/weapon/firework_star/aesthetic/configurable/attack_self(var/mob/user)
var/choice = tgui_alert(usr, "What setting do you want to adjust?", "Firework Star", list("Color", "Shape", "Nothing"))
if(src.loc != user)
return
if(choice == "Color")
var/color_choice = tgui_input_list(user, "What color would you like firework to be?", "Firework Star", firework_colors)
if(src.loc != user)
return
if(color_choice)
current_color = color_choice
if(choice == "Shape")
var/shape_choice = tgui_input_list(user, "What shape would you like firework to be?", "Firework Star", firework_shapes)
if(src.loc != user)
return
if(shape_choice)
current_shape = shape_choice
/obj/item/weapon/firework_star/aesthetic/configurable/get_firework_message()
var/temp_shape = current_shape
if(temp_shape == "Random")
var/list/shapes_copy = firework_shapes.Copy()
shapes_copy -= "Random"
temp_shape = pick(shapes_copy)
if(temp_shape == "none" || !temp_shape)
return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky!"
else
return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky, forming into shape of [current_shape]!"
@@ -0,0 +1,8 @@
/obj/item/weapon/circuitboard/firework_launcher
name = T_BOARD("firework launcher")
board_type = new /datum/frame/frame_types/machine
build_path = /obj/machinery/firework_launcher
origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 2)
req_components = list (
/obj/item/weapon/stock_parts/micro_laser = 2
)
+1 -1
View File
@@ -90,7 +90,7 @@
if(re.id == "nutriment" || re.id == "protein" || re.id == "glucose" || re.id == "fishbait")
foodvolume += re.volume
toolspeed = initial(toolspeed) * min(0.75, (0.5 / max(0.5, (foodvolume / Bait.reagents.maximum_volume))))
toolspeed = initial(toolspeed) * 10*(0.01/(0.2*(foodvolume/Bait.reagents.maximum_volume + 0.5))) //VOREStation edit: gives fishing a universal formula because Polaris' doesn't work here. Min value of 1, max value of 1/3, 0.5 at 1/2 filled with bait reagents.
else
toolspeed = initial(toolspeed)
@@ -234,3 +234,8 @@
/datum/reagent/ethanol/angelskiss
glass_icon_file = 'icons/obj/drinks_vr.dmi'
/datum/reagent/ethanol/burnout
glass_icon_state = "burnout"
glass_center_of_mass = list("x"=16, "y"=8)
glass_icon_file = 'icons/obj/drinks_vr.dmi'
@@ -217,14 +217,14 @@
amount = params["amount"]
else
amount = tgui_input_number(usr, "How many items?", "How many items would you like to take out?", 1)
if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src))
return FALSE
var/index = text2num(params["index"])
if(index < 1 || index > LAZYLEN(item_records))
return TRUE
vend(item_records[index], amount)
return TRUE
return FALSE
@@ -257,7 +257,7 @@
if(stat & (NOPOWER|BROKEN))
return TRUE
if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf)))
if(!allowed(usr) && !emagged && locked != -1 && action == "Release")
if((!allowed(usr) && scan_id) && !emagged && locked != -1 && action == "Release")
to_chat(usr, "<span class='warning'>Access denied.</span>")
return TRUE
return ..()
+66 -52
View File
@@ -9,7 +9,7 @@
var/bee_count = 0 // Percent
var/smoked = 0 // Timer
var/honeycombs = 0 // Percent
var/frames = 0
var/list/frames = list() // List of frames inside.
var/maxFrames = 5
/obj/machinery/beehive/update_icon()
@@ -17,8 +17,8 @@
icon_state = "beehive"
if(closed)
add_overlay("lid")
if(frames)
add_overlay("empty[frames]")
if(length(frames))
add_overlay("empty[length(frames)]")
if(honeycombs >= 100)
add_overlay("full[round(honeycombs / 100)]")
if(!smoked)
@@ -38,59 +38,59 @@
/obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user)
if(I.is_crowbar())
closed = !closed
user.visible_message("<span class='notice'>[user] [closed ? "closes" : "opens"] \the [src].</span>", "<span class='notice'>You [closed ? "close" : "open"] \the [src].</span>")
user.visible_message(SPAN_NOTICE("[user] [closed ? "closes" : "opens"] \the [src]."), SPAN_NOTICE("You [closed ? "close" : "open"] \the [src]."))
update_icon()
return
else if(I.is_wrench())
anchored = !anchored
playsound(src, I.usesound, 50, 1)
user.visible_message("<span class='notice'>[user] [anchored ? "wrenches" : "unwrenches"] \the [src].</span>", "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>")
user.visible_message(SPAN_NOTICE("[user] [anchored ? "wrenches" : "unwrenches"] \the [src]."), SPAN_NOTICE("You [anchored ? "wrench" : "unwrench"] \the [src]."))
return
else if(istype(I, /obj/item/bee_smoker))
if(closed)
to_chat(user, "<span class='notice'>You need to open \the [src] with a crowbar before smoking the bees.</span>")
to_chat(user, SPAN_NOTICE("You need to open \the [src] with a crowbar before smoking the bees."))
return
user.visible_message("<span class='notice'>[user] smokes the bees in \the [src].</span>", "<span class='notice'>You smoke the bees in \the [src].</span>")
user.visible_message(SPAN_NOTICE("[user] smokes the bees in \the [src]."), SPAN_NOTICE("You smoke the bees in \the [src]."))
smoked = 30
update_icon()
return
else if(istype(I, /obj/item/honey_frame))
if(closed)
to_chat(user, "<span class='notice'>You need to open \the [src] with a crowbar before inserting \the [I].</span>")
to_chat(user, SPAN_NOTICE("You need to open \the [src] with a crowbar before inserting \the [I]."))
return
if(frames >= maxFrames)
to_chat(user, "<span class='notice'>There is no place for an another frame.</span>")
if(length(frames) >= maxFrames)
to_chat(user, SPAN_NOTICE("There is no place for an another frame."))
return
var/obj/item/honey_frame/H = I
if(H.honey)
to_chat(user, "<span class='notice'>\The [I] is full with beeswax and honey, empty it in the extractor first.</span>")
to_chat(user, SPAN_NOTICE("\The [I] is full with beeswax and honey, empty it in the extractor first."))
return
++frames
user.visible_message("<span class='notice'>[user] loads \the [I] into \the [src].</span>", "<span class='notice'>You load \the [I] into \the [src].</span>")
user.visible_message(SPAN_NOTICE("[user] loads \the [I] into \the [src]."), SPAN_NOTICE("You load \the [I] into \the [src]."))
update_icon()
user.drop_from_inventory(I)
qdel(I)
user.drop_from_inventory(H)
H.forceMove(src)
frames.Add(H)
return
else if(istype(I, /obj/item/bee_pack))
var/obj/item/bee_pack/B = I
if(B.full && bee_count)
to_chat(user, "<span class='notice'>\The [src] already has bees inside.</span>")
to_chat(user, SPAN_NOTICE("\The [src] already has bees inside."))
return
if(!B.full && bee_count < 90)
to_chat(user, "<span class='notice'>\The [src] is not ready to split.</span>")
to_chat(user, SPAN_NOTICE("\The [src] is not ready to split."))
return
if(!B.full && !smoked)
to_chat(user, "<span class='notice'>Smoke \the [src] first!</span>")
to_chat(user, SPAN_NOTICE("Smoke \the [src] first!"))
return
if(closed)
to_chat(user, "<span class='notice'>You need to open \the [src] with a crowbar before moving the bees.</span>")
to_chat(user, SPAN_NOTICE("You need to open \the [src] with a crowbar before moving the bees."))
return
if(B.full)
user.visible_message("<span class='notice'>[user] puts the queen and the bees from \the [I] into \the [src].</span>", "<span class='notice'>You put the queen and the bees from \the [I] into \the [src].</span>")
user.visible_message(SPAN_NOTICE("[user] puts the queen and the bees from \the [I] into \the [src]."), SPAN_NOTICE("You put the queen and the bees from \the [I] into \the [src]."))
bee_count = 20
B.empty()
else
user.visible_message("<span class='notice'>[user] puts bees and larvae from \the [src] into \the [I].</span>", "<span class='notice'>You put bees and larvae from \the [src] into \the [I].</span>")
user.visible_message(SPAN_NOTICE("[user] puts bees and larvae from \the [src] into \the [I]."), SPAN_NOTICE("You put bees and larvae from \the [src] into \the [I]."))
bee_count /= 2
B.fill()
update_icon()
@@ -98,9 +98,9 @@
else if(istype(I, /obj/item/device/analyzer/plant_analyzer))
to_chat(user, "<span class='notice'>Scan result of \the [src]...</span>")
to_chat(user, "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]")
if(frames)
to_chat(user, "[frames] frames installed, [round(honeycombs / 100)] filled.")
if(honeycombs < frames * 100)
if(length(frames))
to_chat(user, "[length(frames)] frames installed, [round(honeycombs / 100)] filled.")
if(honeycombs < length(frames) * 100)
to_chat(user, "Next frame is [round(honeycombs % 100)]% full.")
else
to_chat(user, "No frames installed.")
@@ -109,12 +109,15 @@
return 1
else if(I.is_screwdriver())
if(bee_count)
to_chat(user, "<span class='notice'>You can't dismantle \the [src] with these bees inside.</span>")
to_chat(user, SPAN_NOTICE("You can't dismantle \the [src] with these bees inside."))
return
to_chat(user, "<span class='notice'>You start dismantling \the [src]...</span>")
if(length(frames))
to_chat(user, SPAN_NOTICE("You can't dismantle \the [src] with [length(frames)] frames still inside!"))
return
to_chat(user, SPAN_NOTICE("You start dismantling \the [src]..."))
playsound(src, I.usesound, 50, 1)
if(do_after(user, 30))
user.visible_message("<span class='notice'>[user] dismantles \the [src].</span>", "<span class='notice'>You dismantle \the [src].</span>")
user.visible_message(SPAN_NOTICE("[user] dismantles \the [src]."), SPAN_NOTICE("You dismantle \the [src]."))
new /obj/item/beehive_assembly(loc)
qdel(src)
return
@@ -122,19 +125,21 @@
/obj/machinery/beehive/attack_hand(var/mob/user)
if(!closed)
if(honeycombs < 100)
to_chat(user, "<span class='notice'>There are no filled honeycombs.</span>")
to_chat(user, SPAN_NOTICE("There are no filled honeycombs."))
return
if(!smoked && bee_count)
to_chat(user, "<span class='notice'>The bees won't let you take the honeycombs out like this, smoke them first.</span>")
to_chat(user, SPAN_NOTICE("The bees won't let you take the honeycombs out like this, smoke them first."))
return
user.visible_message("<span class='notice'>[user] starts taking the honeycombs out of \the [src].</span>", "<span class='notice'>You start taking the honeycombs out of \the [src]...</span>")
while(honeycombs >= 100 && do_after(user, 30))
new /obj/item/honey_frame/filled(loc)
user.visible_message(SPAN_NOTICE("[user] starts taking the honeycombs out of \the [src]."), SPAN_NOTICE("You start taking the honeycombs out of \the [src]..."))
while(honeycombs >= 100 && length(frames) && do_after(user, 30))
var/obj/item/honey_frame/H = pop(frames)
H.honey = 20
honeycombs -= 100
--frames
H.update_icon()
H.forceMove(get_turf(src))
update_icon()
if(honeycombs < 100)
to_chat(user, "<span class='notice'>You take all filled honeycombs out.</span>")
to_chat(user, SPAN_NOTICE("You take all filled honeycombs out."))
return
/obj/machinery/beehive/process()
@@ -153,45 +158,47 @@
if(H.seed && !H.dead)
H.health += 0.05 * coef
++trays
honeycombs = min(honeycombs + 0.1 * coef * min(trays, 5), frames * 100)
honeycombs = min(honeycombs + 0.1 * coef * min(trays, 5), length(frames) * 100)
/obj/machinery/honey_extractor
name = "honey extractor"
desc = "A machine used to turn honeycombs on the frame into honey and wax."
icon = 'icons/obj/virology_vr.dmi' //VOREStation Edit
icon = 'icons/obj/beekeeping.dmi'
icon_state = "centrifuge"
density = TRUE
var/processing = 0
var/honey = 0
/obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user)
if(processing)
to_chat(user, "<span class='notice'>\The [src] is currently spinning, wait until it's finished.</span>")
to_chat(user, SPAN_NOTICE("\The [src] is currently spinning, wait until it's finished."))
return
else if(istype(I, /obj/item/honey_frame))
var/obj/item/honey_frame/H = I
if(!H.honey)
to_chat(user, "<span class='notice'>\The [H] is empty, put it into a beehive.</span>")
to_chat(user, SPAN_NOTICE("\The [H] is empty, put it into a beehive."))
return
user.visible_message("<span class='notice'>[user] loads \the [H] into \the [src] and turns it on.</span>", "<span class='notice'>You load \the [H] into \the [src] and turn it on.</span>")
user.visible_message(SPAN_NOTICE("[user] loads \the [H]'s comb into \the [src] and turns it on."), SPAN_NOTICE("You load \the [H] into \the [src] and turn it on."))
processing = H.honey
icon_state = "centrifuge_moving"
qdel(H)
icon_state = "[initial(icon_state)]_moving"
H.honey = 0
H.update_icon()
spawn(50)
new /obj/item/honey_frame(loc)
new /obj/item/stack/material/wax(loc)
honey += processing
processing = 0
icon_state = "centrifuge"
icon_state = "[initial(icon_state)]"
else if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(!honey)
to_chat(user, "<span class='notice'>There is no honey in \the [src].</span>")
to_chat(user, SPAN_NOTICE("There is no honey in \the [src]."))
return
var/obj/item/weapon/reagent_containers/glass/G = I
var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey)
G.reagents.add_reagent("honey", transferred)
honey -= transferred
user.visible_message("<span class='notice'>[user] collects honey from \the [src] into \the [G].</span>", "<span class='notice'>You collect [transferred] units of honey from \the [src] into \the [G].</span>")
user.visible_message(SPAN_NOTICE("[user] collects honey from \the [src] into \the [G]."), SPAN_NOTICE("You collect [transferred] units of honey from \the [src] into \the [G]."))
return 1
/obj/item/bee_smoker
@@ -210,15 +217,22 @@
var/honey = 0
/obj/item/honey_frame/Initialize()
. = ..()
update_icon()
/obj/item/honey_frame/update_icon()
..()
overlays.Cut()
if(honey > 0)
add_overlay("honeycomb")
/obj/item/honey_frame/filled
name = "filled beehive frame"
desc = "A frame for the beehive that the bees have filled with honeycombs."
honey = 20
/obj/item/honey_frame/filled/New()
..()
add_overlay("honeycomb")
/obj/item/beehive_assembly
name = "beehive assembly"
desc = "Contains everything you need to build a beehive."
@@ -226,9 +240,9 @@
icon_state = "apiary"
/obj/item/beehive_assembly/attack_self(var/mob/user)
to_chat(user, "<span class='notice'>You start assembling \the [src]...</span>")
to_chat(user, SPAN_NOTICE("You start assembling \the [src]..."))
if(do_after(user, 30))
user.visible_message("<span class='notice'>[user] constructs a beehive.</span>", "<span class='notice'>You construct a beehive.</span>")
user.visible_message(SPAN_NOTICE("[user] constructs a beehive."), SPAN_NOTICE("You construct a beehive."))
new /obj/machinery/beehive(get_turf(user))
user.drop_from_inventory(src)
qdel(src)
@@ -283,4 +297,4 @@ var/global/list/datum/stack_recipe/wax_recipes = list( \
name = initial(name)
desc = initial(desc)
cut_overlays()
add_overlay("beepack-full")
add_overlay("beepack-full")
+1 -1
View File
@@ -414,7 +414,7 @@
roundstart = 0
mysterious = 1
seed_noun = pick("spores","nodes","cuttings","seeds")
seed_noun = pick("spores","nodes","cuttings","seeds","pits")
set_trait(TRAIT_POTENCY,rand(5,30),200,0)
set_trait(TRAIT_PRODUCT_ICON,pick(SSplants.accessible_product_sprites))
+11 -3
View File
@@ -94,15 +94,23 @@
if(prob(50))
S.set_trait(TRAIT_BIOLUM, !S.get_trait(TRAIT_BIOLUM))
if(S.get_trait(TRAIT_BIOLUM))
T.visible_message("<b>\The [S.display_name]</b> begins to glow!")
T.visible_message(SPAN_NOTICE("\The [S.display_name] begins to glow!"))
if(prob(50))
S.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190))
T.visible_message("<span class='notice'>\The [S.display_name]'s glow </span><font color='[S.get_trait(TRAIT_BIOLUM_COLOUR)]'>changes colour</font>!")
else
T.visible_message("<span class='notice'>\The [S.display_name]'s glow dims...</span>")
else
T.visible_message(SPAN_NOTICE("\The [S.display_name]'s glow dims..."))
if(prob(60))
S.set_trait(TRAIT_PRODUCES_POWER, !S.get_trait(TRAIT_PRODUCES_POWER))
if(prob(30))
S.set_trait(TRAIT_SPORING, !S.get_trait(TRAIT_SPORING))
if(S.get_trait(TRAIT_SPORING))
T.visible_message(SPAN_NOTICE("\The [S.display_name] releases a cloud of spores!"))
S.create_spores(T)
else
T.visible_message(SPAN_NOTICE("\The [S.display_name]'s spores no longer fall."))
/decl/plantgene/atmosphere/mutate(var/datum/seed/S)
if(prob(60))
S.set_trait(TRAIT_HEAT_TOLERANCE, S.get_trait(TRAIT_HEAT_TOLERANCE)+rand(-2,2),40,0)
@@ -120,7 +120,7 @@
if(seed.get_trait(TRAIT_CARNIVOROUS) >= 2)
growth_type = 1 // WOOOORMS.
else if(!(seed.seed_noun in list("seeds","pits")))
if(seed.seed_noun == "nodes")
if(seed.seed_noun in list("nodes", "cuttings"))
growth_type = 3 // Biomass
else
growth_type = 4 // Mold
@@ -91,22 +91,27 @@
if(prob(chance))
sampled = 0
if(is_mature() && !has_buckled_mobs())
for(var/turf/neighbor in neighbors)
for(var/mob/living/M in neighbor)
if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY)))))
entangle(M)
if(is_mature())
if(!has_buckled_mobs())
for(var/turf/neighbor in neighbors)
for(var/mob/living/M in neighbor)
if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY)))))
entangle(M)
if(is_mature() && neighbors.len && prob(spread_chance))
//spread to 1-3 adjacent turfs depending on yield trait.
var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3)
if(seed.get_trait(TRAIT_SPORING) && prob(1))
visible_message(SPAN_WARNING("\The [src] hisses, releasing a cloud of spores!"), SPAN_WARNING("Something nearby hisses loudly!"))
seed.create_spores(get_turf(src))
for(var/i in 1 to max_spread)
if(prob(spread_chance))
sleep(rand(3,5))
if(!neighbors.len)
break
spread_to(pick(neighbors))
if(length(neighbors) && prob(spread_chance))
//spread to 1-3 adjacent turfs depending on yield trait.
var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3)
for(var/i in 1 to max_spread)
if(prob(spread_chance))
sleep(rand(3,5))
if(!length(neighbors))
break
spread_to(pick(neighbors))
// We shouldn't have spawned if the controller doesn't exist.
check_health()
@@ -128,7 +133,7 @@
//move out to the destination
child.anchored = FALSE
step_to(child, target_turf)
child.Move(target_turf) // Do a normal move, so we can cross and uncross things we need to. Stairs, Open space "falling", etc.
child.anchored = TRUE
child.update_icon()
@@ -177,4 +182,4 @@
SSplants.add_plant(neighbor)
spawn(1) if(src) qdel(src)
#undef NEIGHBOR_REFRESH_TIME
#undef NEIGHBOR_REFRESH_TIME
+1 -2
View File
@@ -132,13 +132,12 @@
display_name = "reinforced borosilicate glass"
stack_type = /obj/item/stack/material/glass/phoronrglass
stack_origin_tech = list(TECH_MATERIAL = 5)
composite_material = list() //todo
window_options = list("One Direction" = 1, "Full Window" = 4)
created_window = /obj/structure/window/phoronreinforced
created_fulltile_window = /obj/structure/window/phoronreinforced/full
hardness = 40
weight = 30
stack_origin_tech = list(TECH_MATERIAL = 2)
composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT / 2, "borosilicate glass" = SHEET_MATERIAL_AMOUNT)
composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT / 2, MAT_PGLASS = SHEET_MATERIAL_AMOUNT)
rod_product = null
flags = MATERIAL_UNMELTABLE
@@ -13,7 +13,6 @@
created_fulltile_window = /obj/structure/window/titanium/full
wire_product = null
rod_product = /obj/item/stack/material/glass/titanium
composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT, MAT_GLASS = SHEET_MATERIAL_AMOUNT)
/datum/material/glass/plastaniumglass
name = MAT_PLASTITANIUMGLASS
@@ -30,4 +29,3 @@
created_fulltile_window = /obj/structure/window/plastitanium/full
wire_product = null
rod_product = /obj/item/stack/material/glass/plastitanium
composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT, MAT_GLASS = SHEET_MATERIAL_AMOUNT)
@@ -7,6 +7,7 @@
icon_reinf = "reinf_mesh"
icon_colour = "#666677"
flags = MATERIAL_UNMELTABLE
composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT)
/datum/material/steel/hull/place_sheet(var/turf/target) //Deconstructed into normal steel sheets.
new /obj/item/stack/material/steel(target)
@@ -20,6 +21,7 @@
icon_colour = "#777788"
explosion_resistance = 40
flags = MATERIAL_UNMELTABLE
composite_material = list(MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT)
/datum/material/plasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets.
new /obj/item/stack/material/plasteel(target)
@@ -33,6 +35,7 @@
explosion_resistance = 90
reflectivity = 0.9
flags = MATERIAL_UNMELTABLE
composite_material = list(MAT_DURASTEEL = SHEET_MATERIAL_AMOUNT)
/datum/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets.
new /obj/item/stack/material/durasteel(target)
@@ -43,6 +46,7 @@
icon_base = "hull"
icon_reinf = "reinf_mesh"
flags = MATERIAL_UNMELTABLE
composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT)
/datum/material/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets.
new /obj/item/stack/material/titanium(target)
@@ -53,6 +57,7 @@
icon_base = "hull"
icon_reinf = "reinf_mesh"
flags = MATERIAL_UNMELTABLE
composite_material = list(MAT_MORPHIUM = SHEET_MATERIAL_AMOUNT)
/datum/material/morphium/hull/place_sheet(var/turf/target)
new /obj/item/stack/material/morphium(target)
@@ -5,6 +5,7 @@
icon_reinf = "reinf_mesh"
icon_colour = "#585658"
explosion_resistance = 50
composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT)
/datum/material/plastitanium/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets.
new /obj/item/stack/material/plastitanium(target)
@@ -15,6 +16,7 @@
icon_base = "hull"
icon_reinf = "reinf_mesh"
explosion_resistance = 50
composite_material = list(MAT_GOLD = SHEET_MATERIAL_AMOUNT)
/datum/material/gold/hull/place_sheet(var/turf/target) //Deconstructed into normal gold sheets.
new /obj/item/stack/material/gold(target)
@@ -17,7 +17,6 @@
protectiveness = 60 // 75%
reflectivity = 0.7 // Not a perfect mirror, but close.
stack_origin_tech = list(TECH_MATERIAL = 8)
composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug
supply_conversion_value = 9
/datum/material/titanium
@@ -28,7 +27,6 @@
door_icon_base = "metal"
icon_colour = "#D1E6E3"
icon_reinf = "reinf_metal"
composite_material = null
/datum/material/iron
name = "iron"
@@ -12,7 +12,6 @@
protectiveness = 20 // 50%
conductivity = 13 // For the purposes of balance.
stack_origin_tech = list(TECH_MATERIAL = 2)
composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo
supply_conversion_value = 6
/datum/material/plasteel/generate_recipes()
@@ -38,3 +37,4 @@
stack_type = /obj/item/stack/material/plasteel/rebar
sheet_singular_name = "rod"
sheet_plural_name = "rods"
composite_material = list(MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT)
@@ -12,7 +12,6 @@
protectiveness = 30
conductivity = 7
stack_origin_tech = list(TECH_MATERIAL = 5)
composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT, MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT)
supply_conversion_value = 8
/datum/material/plastitanium/generate_recipes()
@@ -54,13 +54,10 @@
EQUIPMENT("Defense Equipment - Plasteel Machete", /obj/item/weapon/material/knife/machete, 50),
EQUIPMENT("Defense Equipment - Razor Drone Deployer", /obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 100),
EQUIPMENT("Defense Equipment - Sentry Drone Deployer", /obj/item/weapon/grenade/spawnergrenade/ward, 150),
<<<<<<< HEAD
EQUIPMENT("Defense Equipment - Frontier Carbine", /obj/item/weapon/gun/energy/locked/frontier/carbine, 400), //CHOMPEDIT
EQUIPMENT("Defense Equipment - Frontier Phaser", /obj/item/weapon/gun/energy/locked/frontier, 150), //CHOMPADD
EQUIPMENT("Defense Equipment - Holdout Phaser", /obj/item/weapon/gun/energy/locked/frontier/holdout, 100), //CHOMPADD
=======
// EQUIPMENT("Defense Equipment - Frontier Carbine", /obj/item/weapon/gun/energy/locked/frontier/carbine, 750), //VOREStation removal
>>>>>>> 244095be9e... Merge pull request #14220 from Very-Soft/removeexplo
EQUIPMENT("Defense Equipment - Marksman Frontier Phaser", /obj/item/weapon/gun/energy/locked/frontier/rifle, 1500), //CHOMPADD
EQUIPMENT("Defense Equipment - Frontier Carbine", /obj/item/weapon/gun/energy/locked/frontier/carbine, 1500), //CHOMPEDIT
EQUIPMENT("Defense Equipment - Frontier Phaser", /obj/item/weapon/gun/energy/locked/frontier, 1200), //CHOMPADD
EQUIPMENT("Defense Equipment - Holdout Frontier Phaser", /obj/item/weapon/gun/energy/locked/frontier/holdout, 700), //CHOMPADD
EQUIPMENT("Hybrid Equipment - Proto-Kinetic Dagger", /obj/item/weapon/kinetic_crusher/machete/dagger, 75),
EQUIPMENT("Hybrid Equipment - Proto-Kinetic Machete", /obj/item/weapon/kinetic_crusher/machete, 250),
EQUIPMENT("Fishing Net", /obj/item/weapon/material/fishing_net, 50),
+4 -4
View File
@@ -47,10 +47,10 @@ var/list/slot_equipment_priority = list( \
//set del_on_fail to have it delete W if it fails to equip
//set disable_warning to disable the 'you are unable to equip that' warning.
//unset redraw_mob to prevent the mob from being redrawn at the end.
/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1)
/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1, ignore_obstructions = 1)
if(!W)
return 0
if(!W.mob_can_equip(src, slot, disable_warning))
if(!W.mob_can_equip(src, slot, disable_warning, ignore_obstructions))
if(del_on_fail)
qdel(W)
@@ -68,8 +68,8 @@ var/list/slot_equipment_priority = list( \
return
//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.
/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot)
return equip_to_slot_if_possible(W, slot, 1, 1, 0)
/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot, ignore_obstructions = 1)
return equip_to_slot_if_possible(W, slot, 1, 1, 0, ignore_obstructions)
//hurgh. these feel hacky, but they're the only way I could get the damn thing to work. I guess they could be handy for antag spawners too?
/mob/proc/equip_voidsuit_to_slot_or_del_with_refit(obj/item/clothing/suit/space/void/W as obj, slot, species = SPECIES_HUMAN)
@@ -0,0 +1,2 @@
/mob/living/carbon/human/ai_controlled
sensorpref = 1
@@ -9,6 +9,7 @@
var/sensorpref = 5 //Suit sensor loadout pref
var/wings_hidden = FALSE
var/tail_hidden = FALSE
var/markings_len = 0 //mostly an arbitrary number
/mob/living/carbon/human/proc/shadekin_get_energy()
var/datum/species/shadekin/SK = species
@@ -7,3 +7,116 @@ var/static/icon/ingame_hud_med_vr = icon('icons/mob/hud_med_vr.dmi')
hud_list[STATUS_R_HUD] = gen_hud_image(ingame_hud_vr, src, plane = PLANE_CH_STATUS_R)
hud_list[BACKUP_HUD] = gen_hud_image(ingame_hud_vr, src, plane = PLANE_CH_BACKUP)
hud_list[VANTAG_HUD] = gen_hud_image(ingame_hud_vr, src, plane = PLANE_CH_VANTAG)
/mob/living/carbon/human/proc/remove_marking(var/datum/sprite_accessory/marking/mark_datum)
if (!mark_datum)
return FALSE
var/successful = FALSE
for(var/BP in mark_datum.body_parts)
var/obj/item/organ/external/O = organs_by_name[BP]
if(O)
successful = O.markings.Remove(mark_datum.name) || successful
if (successful)
markings_len -= 1
update_dna()
update_icons_body()
return TRUE
return FALSE
/mob/living/carbon/human/proc/add_marking(var/datum/sprite_accessory/marking/mark_datum, var/mark_color = "#000000")
if (!mark_datum)
return FALSE
var/success = FALSE
for(var/BP in mark_datum.body_parts)
var/obj/item/organ/external/O = organs_by_name[BP]
if(O)
success = TRUE
O.markings[mark_datum.name] = list("color" = mark_color, "datum" = mark_datum, "priority" = markings_len + 1)
if (success)
markings_len += 1
update_dna()
update_icons_body()
return success
/mob/living/carbon/human/proc/change_priority_of_marking(var/datum/sprite_accessory/marking/mark_datum, var/move_down, var/swap = TRUE) //move_down should be true/false
if (!mark_datum)
return FALSE
var/change = move_down ? 1 : -1
var/success = FALSE
for(var/BP in mark_datum.body_parts)
var/obj/item/organ/external/O = organs_by_name[BP]
if(O)
var/index = O.markings.Find(mark_datum.name)
if (!index)
continue
var/change_from = O.markings[mark_datum.name]["priority"]
if (change_from == clamp(change_from + change, 1, markings_len))
continue
if (!success)
success = TRUE
change_priority_marking_to_priority(change_from + change, change_from)
O.markings[mark_datum.name]["priority"] = clamp(change_from + change, 1, markings_len)
if ((move_down && index == O.markings.len) || (!move_down && index == 1))
continue
if (O.markings[O.markings[index + change]]["priority"] == change_from)
moveElement(O.markings, index, index+(move_down ? 2 : -1))
if (success)
update_dna()
update_icons_body()
return TRUE
/mob/living/carbon/human/proc/change_priority_marking_to_priority(var/priority, var/to_priority)
for (var/obj/item/organ/external/O in organs)
for (var/marking in O.markings)
if (O.markings[marking]["priority"] == priority)
O.markings[marking]["priority"] = to_priority
/mob/living/carbon/human/proc/change_marking_color(var/datum/sprite_accessory/marking/mark_datum, var/mark_color = "#000000")
if (!mark_datum)
return FALSE
var/success = FALSE
for(var/BP in mark_datum.body_parts)
var/obj/item/organ/external/O = organs_by_name[BP]
if(O && O.markings[mark_datum.name] && O.markings[mark_datum.name]["color"] != mark_color)
success = TRUE
O.markings[mark_datum.name]["color"] = mark_color
if (success)
update_dna()
update_icons_body()
return success
/mob/living/carbon/human/proc/get_prioritised_markings()
var/list/markings = list()
var/list/priorities = list()
for(var/obj/item/organ/external/O in organs)
if(O.markings?.len)
for (var/marking in O.markings)
var/priority = num2text(O.markings[marking]["priority"])
if (markings[priority])
markings[priority] |= list("[marking]" = O.markings[marking]["color"]) //yes I know technically you could have a limb that was attached that has the same marking as another limb with a different color but I'm too tired
else
priorities |= O.markings[marking]["priority"]
markings[priority] = list("[marking]" = O.markings[marking]["color"])
var/list/sorted = list()
while (priorities.len > 0)
var/priority = min(priorities)
priorities.Remove(priority)
priority = num2text(priority)
for (var/marking in markings[priority])
if (!(marking in sorted))
sorted[marking] = markings[priority][marking]
del(markings)
del(priorities)
markings_len = sorted.len
//todo - add an autofixing thing for having markings with the same priorities as another, and for having markings that should have the same priorities across bodyparts, but don't
//does not really need to happen, that kinda thing will only happen when putting another person's limb onto your own body
return sorted
@@ -1137,7 +1137,7 @@
for(var/mob/living/L in T)
if(L == src) //no eating yourself. 1984.
continue
if(L.devourable)
if(L.devourable && L.can_be_drop_prey)
targets += L
if(!(targets.len))
+2
View File
@@ -1125,6 +1125,7 @@
if(!item)
return FALSE //Grab processing has a chance of returning null
/* CHOMPEdit. If I want to do a nice little give I use the actual verb for it.
if(a_intent == I_HELP && Adjacent(target) && isitem(item) && ishuman(target))
var/obj/item/I = item
var/mob/living/carbon/human/H = target
@@ -1135,6 +1136,7 @@
to_chat(src, SPAN_NOTICE("You offer \the [I] to \the [target]."))
do_give(H)
return TRUE
*/
drop_from_inventory(item)
@@ -101,14 +101,6 @@
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
//Being hit while using a deadman switch
if(istype(get_active_hand(),/obj/item/device/assembly/signaler))
var/obj/item/device/assembly/signaler/signaler = get_active_hand()
if(signaler.deadman && prob(80))
log_and_message_admins("has triggered a signaler deadman's switch")
src.visible_message("<font color='red'>[src] triggers their deadman's switch!</font>")
signaler.signal()
if(ai_holder && P.firer)
ai_holder.react_to_attack(P.firer)
@@ -33,4 +33,6 @@ var/list/_robot_default_emotes = list(
)
/mob/living/silicon/robot/get_available_emotes()
return global._robot_default_emotes.Copy()
var/list/fulllist = global._robot_default_emotes.Copy()
fulllist |= _human_default_emotes
return fulllist
@@ -1,15 +1,15 @@
var/global/list/robot_modules = list(
"Standard" = /obj/item/weapon/robot_module/robot/standard,
"Service" = /obj/item/weapon/robot_module/robot/clerical/butler,
"Service" = /obj/item/weapon/robot_module/robot/clerical/butler/general,
"Clerical" = /obj/item/weapon/robot_module/robot/clerical/general,
"Research" = /obj/item/weapon/robot_module/robot/research,
"Miner" = /obj/item/weapon/robot_module/robot/miner,
"Research" = /obj/item/weapon/robot_module/robot/research/general,
"Miner" = /obj/item/weapon/robot_module/robot/miner/general,
"Crisis" = /obj/item/weapon/robot_module/robot/medical/crisis,
"Surgeon" = /obj/item/weapon/robot_module/robot/medical/surgeon,
"Security" = /obj/item/weapon/robot_module/robot/security/general,
"Combat" = /obj/item/weapon/robot_module/robot/security/combat,
"Engineering" = /obj/item/weapon/robot_module/robot/engineering/general,
"Janitor" = /obj/item/weapon/robot_module/robot/janitor,
"Janitor" = /obj/item/weapon/robot_module/robot/janitor/general,
"Gravekeeper" = /obj/item/weapon/robot_module/robot/gravekeeper,
"Lost" = /obj/item/weapon/robot_module/robot/lost,
"Protector" = /obj/item/weapon/robot_module/robot/syndicate/protector,
@@ -586,17 +586,18 @@ var/global/list/robot_modules = list(
"Tower" = "drider-Janitor"
)
/obj/item/weapon/robot_module/robot/janitor/New()
/obj/item/weapon/robot_module/robot/janitor/general/New()
..()
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash(src)
src.modules += new /obj/item/weapon/mop(src)
src.modules += new /obj/item/pupscrubber(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("lube", 250)
src.emag.name = "Lube spray"
/obj/item/weapon/robot_module/robot/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
/obj/item/weapon/robot_module/robot/janitor/general/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
LR.Charge(R, amount)
if(src.emag)
@@ -626,6 +627,9 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/robot/clerical/butler
channels = list("Service" = 1)
/obj/item/weapon/robot_module/robot/clerical/butler/general
sprites = list(
"M-USE NanoTrasen" = "robotServ",
"Cabeiri" = "eyebot-standard",
@@ -651,7 +655,7 @@ var/global/list/robot_modules = list(
"Tower" = "drider-Service"
)
/obj/item/weapon/robot_module/robot/clerical/butler/New()
/obj/item/weapon/robot_module/robot/clerical/butler/general/New()
..()
src.modules += new /obj/item/weapon/gripper/service(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
@@ -752,7 +756,7 @@ var/global/list/robot_modules = list(
)
supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill)
/obj/item/weapon/robot_module/robot/miner/New()
/obj/item/weapon/robot_module/robot/miner/general/New()
..()
src.modules += new /obj/item/borg/sight/material(src)
src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
@@ -790,7 +794,7 @@ var/global/list/robot_modules = list(
)
supported_upgrades = list(/obj/item/borg/upgrade/advrped)
/obj/item/weapon/robot_module/robot/research/New()
/obj/item/weapon/robot_module/robot/research/general/New()
..()
src.modules += new /obj/item/weapon/portable_destructive_analyzer(src)
src.modules += new /obj/item/weapon/gripper/research(src)
@@ -834,7 +838,7 @@ var/global/list/robot_modules = list(
C.synths = list(wire)
src.modules += C
/obj/item/weapon/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
/obj/item/weapon/robot_module/robot/research/general/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
if(S.mode == 2)
@@ -63,19 +63,19 @@
)
/hook/startup/proc/robot_modules_vr()
robot_modules["Medihound"] = /obj/item/weapon/robot_module/robot/medihound
robot_modules["K9"] = /obj/item/weapon/robot_module/robot/knine
robot_modules["ERT"] = /obj/item/weapon/robot_module/robot/ert
robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/scrubpup
robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/science
robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog
robot_modules["Service-Hound"] = /obj/item/weapon/robot_module/robot/clerical/brodog
robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze
robot_modules["KMine"] = /obj/item/weapon/robot_module/robot/kmine
robot_modules["Medihound"] = /obj/item/weapon/robot_module/robot/medical/medihound
robot_modules["K9"] = /obj/item/weapon/robot_module/robot/security/knine
robot_modules["ERT"] = /obj/item/weapon/robot_module/robot/security/ert
robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/janitor/scrubpup
robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/research/sciencehound
robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engineering/engiedog
robot_modules["Service-Hound"] = /obj/item/weapon/robot_module/robot/clerical/butler/brodog
robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/clerical/butler/booze
robot_modules["KMine"] = /obj/item/weapon/robot_module/robot/miner/kmine
robot_modules["UnityHound"] = /obj/item/weapon/robot_module/robot/chound //CHOMP Addition Unity
robot_modules["Honk-Hound"] = /obj/item/weapon/robot_module/robot/clerical/honkborg //CHOMP Addition Honk
robot_modules["Stray"] = /obj/item/weapon/robot_module/robot/stray
robot_modules["TraumaHound"] = /obj/item/weapon/robot_module/robot/medical/trauma
robot_modules["TraumaHound"] = /obj/item/weapon/robot_module/robot/medical/traumahound
return 1
//Just add a new proc with the robot_module type if you wish to run some other vore code
@@ -94,8 +94,10 @@
src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people.
. = ..() //Any Global vore modules will come from here
/obj/item/weapon/robot_module/robot/medical/surgeon
/obj/item/weapon/robot_module/robot/medical
pto_type = PTO_MEDICAL
/obj/item/weapon/robot_module/robot/medical/surgeon
vr_sprites = list(
"Acheron" = "mechoid-Medical",
"Shellguard Noble" = "Noble-MED",
@@ -105,7 +107,6 @@
)
/obj/item/weapon/robot_module/robot/medical/crisis
pto_type = PTO_MEDICAL
vr_sprites = list(
"Handy" = "handy-med",
"Acheron" = "mechoid-Medical",
@@ -115,8 +116,10 @@
"Feminine Humanoid" = "uptall-crisis"
)
/obj/item/weapon/robot_module/robot/clerical/butler
/obj/item/weapon/robot_module/robot/clerical
pto_type = PTO_CIVILIAN
/obj/item/weapon/robot_module/robot/clerical/butler/general
vr_sprites = list(
"Handy - Service" = "handy-service",
"Handy - Hydro" = "handy-hydro",
@@ -128,7 +131,6 @@
)
/obj/item/weapon/robot_module/robot/clerical/general
pto_type = PTO_CIVILIAN
vr_sprites = list(
"Handy" = "handy-clerk",
"Acheron" = "mechoid-Service",
@@ -140,6 +142,8 @@
/obj/item/weapon/robot_module/robot/janitor
pto_type = PTO_CIVILIAN
/obj/item/weapon/robot_module/robot/janitor/general
vr_sprites = list(
"Handy" = "handy-janitor",
"Acheron" = "mechoid-Janitor",
@@ -149,8 +153,10 @@
"Feminine Humanoid" = "uptall-janitor"
)
/obj/item/weapon/robot_module/robot/security/general
/obj/item/weapon/robot_module/robot/security
pto_type = PTO_SECURITY
/obj/item/weapon/robot_module/robot/security/general
vr_sprites = list(
"Handy" = "handy-sec",
"Acheron" = "mechoid-Security",
@@ -160,8 +166,18 @@
"Feminine Humanoid" = "uptall-security"
)
/obj/item/weapon/robot_module/robot/security/combat
vr_sprites = list(
"Acheron" = "mechoid-Combat",
"ZOOM-BA" = "zoomba-combat",
"W02M" = "worm-combat",
"Feminine Humanoid" = "uptall-security"
)
/obj/item/weapon/robot_module/robot/miner
pto_type = PTO_CARGO
/obj/item/weapon/robot_module/robot/miner/general
vr_sprites = list(
"Handy" = "handy-miner",
"Acheron" = "mechoid-Miner",
@@ -182,8 +198,11 @@
"Feminine Humanoid" = "uptall-standard",
"Feminine Humanoid, Variant 2" = "uptall-standard2"
)
/obj/item/weapon/robot_module/robot/engineering/general
/obj/item/weapon/robot_module/robot/engineering
pto_type = PTO_ENGINEERING
/obj/item/weapon/robot_module/robot/engineering/general
vr_sprites = list(
"Acheron" = "mechoid-Engineering",
"Shellguard Noble" = "Noble-ENG",
@@ -194,6 +213,8 @@
/obj/item/weapon/robot_module/robot/research
pto_type = PTO_SCIENCE
/obj/item/weapon/robot_module/robot/research/general
vr_sprites = list(
"Acheron" = "mechoid-Science",
"ZOOM-BA" = "zoomba-research",
@@ -202,16 +223,7 @@
"Feminine Humanoid" = "uptall-science"
)
/obj/item/weapon/robot_module/robot/security/combat
pto_type = PTO_SECURITY
vr_sprites = list(
"Acheron" = "mechoid-Combat",
"ZOOM-BA" = "zoomba-combat",
"W02M" = "worm-combat",
"Feminine Humanoid" = "uptall-security"
)
/obj/item/weapon/robot_module/robot/knine
/obj/item/weapon/robot_module/robot/security/knine
name = "k9 robot module"
sprites = list(
"K9 hound" = "k9",
@@ -224,13 +236,8 @@
"Drake" = "drakesec",
"Secborg model V-4" = "secraptor"//CHOMPEdit
)
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
pto_type = PTO_SECURITY
can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/tasercooler)
/obj/item/weapon/robot_module/robot/knine/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/security/knine/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src) //You need cuffs to be a proper sec borg!
src.modules += new /obj/item/weapon/dogborg/jaws/big(src) //In case there's some kind of hostile mob.
src.modules += new /obj/item/weapon/melee/baton/robot(src) //Since the pounce module refused to work, they get a stunbaton instead.
@@ -275,7 +282,7 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
/obj/item/weapon/robot_module/robot/security/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/flash/F = locate() in src.modules
if(F.broken)
F.broken = 0
@@ -294,13 +301,8 @@
B.bcell.give(amount)*/
/obj/item/weapon/robot_module/robot/medihound
/obj/item/weapon/robot_module/robot/medical/medihound
name = "MediHound module"
channels = list("Medical" = 1)
networks = list(NETWORK_MEDICAL)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
pto_type = PTO_MEDICAL
can_be_pushed = 0
sprites = list(
"Medical Hound" = "medihound",
"Dark Medical Hound (Static)" = "medihounddark",
@@ -312,7 +314,7 @@
"Mediborg model V-4" = "medraptor" //CHOMPEdit
)
/obj/item/weapon/robot_module/robot/medihound/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/medical/medihound/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src) //In case a patient is being attacked by carp.
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop the crew.
src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially.
@@ -396,20 +398,15 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/medical/trauma
/obj/item/weapon/robot_module/robot/medical/traumahound
name = "traumahound robot module"
channels = list("Medical" = 1)
networks = list(NETWORK_MEDICAL)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
pto_type = PTO_MEDICAL
can_be_pushed = 0
sprites = list(
"Traumahound" = "traumavale",
"Drake" = "draketrauma",
"Borgi" = "borgi-trauma"
)
/obj/item/weapon/robot_module/robot/medical/trauma/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/medical/traumahound/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
@@ -484,19 +481,15 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/ert
/obj/item/weapon/robot_module/robot/security/ert
name = "Emergency Responce module"
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
pto_type = PTO_SECURITY
can_be_pushed = 0
sprites = list(
"Standard" = "ert",
"Classic" = "ertold",
"Borgi" = "borgi"
)
/obj/item/weapon/robot_module/robot/ert/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/security/ert/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/dogborg/jaws/ert(src)
src.modules += new /obj/item/taperoll/police(src)
@@ -540,7 +533,7 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/scrubpup
/obj/item/weapon/robot_module/robot/janitor/scrubpup
name = "Custodial Hound module"
sprites = list(
"Custodial Hound" = "scrubpup",
@@ -550,11 +543,9 @@
"Cat" = "vixjani", //CHOMPEdit
"Drake" = "drakejanit"
)
channels = list("Service" = 1)
pto_type = PTO_CIVILIAN
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/scrubpup/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/janitor/scrubpup/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/pupscrubber(src)
@@ -632,7 +623,7 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/science
/obj/item/weapon/robot_module/robot/research/sciencehound
name = "Research Hound Module"
sprites = list(
"Research Hound" = "science",
@@ -643,12 +634,9 @@
"Drake" = "drakesci",
"Sciborg model V-4" = "sciraptor"//CHOMPEdit
)
channels = list("Science" = 1)
pto_type = PTO_SCIENCE
can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/advrped)
/obj/item/weapon/robot_module/robot/science/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/research/sciencehound/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/weapon/gripper/research(src)
@@ -725,7 +713,7 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/engiedog
/obj/item/weapon/robot_module/robot/engineering/engiedog
name = "Construction Hound module"
sprites = list(
"Pupdozer" = "pupdozer",
@@ -736,13 +724,9 @@
"Cat" = "vixengi", //CHOMPEdit
"Drake" = "drakeeng"
)
channels = list("Engineering" = 1)
networks = list(NETWORK_ENGINEERING)
pto_type = PTO_ENGINEERING
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/engiedog/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/engineering/engiedog/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
@@ -888,7 +872,7 @@
..()
// Uses modified K9 sprites.
/obj/item/weapon/robot_module/robot/clerical/brodog
/obj/item/weapon/robot_module/robot/clerical/butler/brodog
name = "service-hound module"
sprites = list(
"Blackhound" = "k50",
@@ -898,13 +882,11 @@
"Cat" = "vixserv", //CHOMPEdit
"Drake" = "drakemine"
)
channels = list("Service" = 1)
pto_type = PTO_CIVILIAN
can_be_pushed = 0
// In a nutshell, basicly service/butler robot but in dog form. - Port from CitadelRP
/obj/item/weapon/robot_module/robot/clerical/brodog/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/clerical/butler/brodog/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/gripper/service(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
src.modules += new /obj/item/weapon/material/minihoe(src)
@@ -970,7 +952,7 @@
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/kmine
/obj/item/weapon/robot_module/robot/miner/kmine
name = "Supply Hound Module"
sprites = list(
"KMine" = "kmine",
@@ -980,12 +962,9 @@
"Cat Cargo" = "vixcargo", //CHOMPEdit
"Drake" = "drakemine"
)
channels = list("Supply" = 1)
pto_type = PTO_CARGO
can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill)
/obj/item/weapon/robot_module/robot/kmine/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/miner/kmine/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/borg/sight/material(src)
src.modules += new /obj/item/weapon/tool/wrench/cyborg(src)
src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
@@ -1054,10 +1033,8 @@
R.verbs -= /mob/living/silicon/robot/proc/rest_style
..()
/obj/item/weapon/robot_module/robot/booze
/obj/item/weapon/robot_module/robot/clerical/butler/booze
name = "BoozeHound robot module"
channels = list("Service" = 1)
pto_type = PTO_CIVILIAN
can_be_pushed = 0
sprites = list(
"Beer Buddy" = "boozeborg",
@@ -1070,7 +1047,7 @@
"Vodka Komrade" = "boozeborg(vodka)"
) //CHOMP Edit Added Vodka Komrade
/obj/item/weapon/robot_module/robot/booze/New(var/mob/living/silicon/robot/R)
/obj/item/weapon/robot_module/robot/clerical/butler/booze/New(var/mob/living/silicon/robot/R)
..()
src.modules += new /obj/item/weapon/gripper/service(src)
//src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
@@ -1117,7 +1094,7 @@
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/booze/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
/obj/item/weapon/robot_module/robot/clerical/butler/booze/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
E.reagents.add_reagent("enzyme", 2 * amount)
@@ -150,7 +150,7 @@
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/New(var/mob/living/silicon/robot/R)
..()
src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/device/healthanalyzer/phasic(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
// Surgery things.
@@ -67,7 +67,7 @@
if(isturf(tile))
B.gather_all(tile, src, 1) //Shhh, unless the bag fills, don't spam the borg's chat with stuff that's going on every time they move!
if(istype(module, /obj/item/weapon/robot_module/robot/janitor) && isturf(loc))
if(scrubbing && isturf(loc))
var/turf/tile = loc
tile.clean_blood()
if (istype(tile, /turf/simulated))
@@ -156,36 +156,6 @@
icon_state = "[module_sprites[icontype]]-wreck"
add_overlay("wreck-overlay")
/mob/living/silicon/robot/Moved(atom/old_loc, direction, forced = FALSE)
. = ..()
if(scrubbing && isturf(loc) && water_res?.energy >= 1)
var/turf/tile = loc
water_res.use_charge(1)
tile.clean_blood()
if(istype(tile, /turf/simulated))
var/turf/simulated/T = tile
T.dirt = 0
for(var/A in tile)
if(istype(A,/obj/effect/rune) || istype(A,/obj/effect/decal/cleanable) || istype(A,/obj/effect/overlay))
qdel(A)
else if(istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/cleaned_human = A
if(cleaned_human.lying)
if(cleaned_human.head)
cleaned_human.head.clean_blood()
cleaned_human.update_inv_head(0)
if(cleaned_human.wear_suit)
cleaned_human.wear_suit.clean_blood()
cleaned_human.update_inv_wear_suit(0)
else if(cleaned_human.w_uniform)
cleaned_human.w_uniform.clean_blood()
cleaned_human.update_inv_w_uniform(0)
if(cleaned_human.shoes)
cleaned_human.shoes.clean_blood()
cleaned_human.update_inv_shoes(0)
cleaned_human.clean_blood(1)
to_chat(cleaned_human, "<span class='warning'>[src] cleans your face!</span>")
/mob/living/silicon/robot/proc/vr_sprite_check()
if(custom_sprite == TRUE)
return
@@ -187,7 +187,7 @@
if(has_eye_glow)
add_eyes()
if(!IsAdvancedToolUser()) //CHOMPSTATION edit: Moved here so the verb is useable before initialising vorgans.
if(vore_active) //CHOMPSTATION edit: Moved here so the verb is useable before initialising vorgans.
verbs |= /mob/living/simple_mob/proc/animal_nom
verbs |= /mob/living/proc/shred_limb
verbs |= /mob/living/simple_mob/proc/nutrition_heal //CHOMPSTATION edit
@@ -325,4 +325,4 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish
/decl/mob_organ_names/fish
hit_zones = list("head", "body", "dorsal fin", "left pectoral fin", "right pectoral fin", "tail fin")
hit_zones = list("head", "body", "dorsal fin", "left pectoral fin", "right pectoral fin", "tail fin")
@@ -17,7 +17,7 @@
name = "crystal-feather duck"
desc = "A glittering flightless bird."
tt_desc = "S Anatidae vitriae"
catalogue_data = list(/datum/category_item/catalogue/fauna/crystalduck)
catalogue_data = list(/datum/category_item/catalogue/fauna/crystalduck)
faction = "duck"
@@ -11,7 +11,7 @@
var/mob/living/victim = null // the person the slime is currently feeding on
var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly.
var/mutation_chance = 30 // CHOMPedit Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes.
var/split_amount = 4 // Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations.
var/split_amount = 5 //Chompedit: increased from 4 to 5 to make xenobio faster and deadlier. Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations.
var/untamable = FALSE //Makes slime untamable via discipline.
var/untamable_inheirit = FALSE //Makes slime inheirit its untamability.
var/list/slime_mutation = list(
@@ -508,6 +508,8 @@ I think I covered everything.
/// My thanks to Raeschen for these descriptions
/mob/living/simple_mob/vore/bigdragon/init_vore()
if(!voremob_loaded) //CHOMPEdit
return
var/obj/belly/B = new /obj/belly/dragon/maw(src)
B.affects_vore_sprites = FALSE //CHOMPEdit - Added so that the new system handles these not affecting the sprite.
B.emote_lists[DM_HOLD] = list(
@@ -47,6 +47,15 @@
icon_dead = "wah_fae_dead"
icon_rest = "wah_fae_rest"
vore_ignores_undigestable = 0 // wah don't care you're edible or not, you still go in
vore_digest_chance = 0 // instead of digesting if you struggle...
vore_absorb_chance = 20 // you get to become adorable purple wahpudge.
vore_bump_chance = 75
maxHealth = 100
health = 100
melee_damage_lower = 10
melee_damage_upper = 20
/mob/living/simple_mob/vore/redpanda/blue
name = "blue wah"
desc = "Blue, but still cute!"
+3 -2
View File
@@ -647,7 +647,8 @@
stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)")
if(ticker && ticker.current_state != GAME_STATE_PREGAME)
stat("Station Time", stationtime2text())
stat("Station Date", stationdate2text())
var/date = "[stationdate2text()], [capitalize(world_time_season)]"
stat("Station Date", date)
stat("Round Duration", roundduration2text())
if(client.holder)
@@ -1274,4 +1275,4 @@ GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list)
/mob/proc/grab_ghost(force)
if(mind)
return mind.grab_ghost(force = force)
return mind.grab_ghost(force = force)
@@ -587,7 +587,7 @@ shadekin_snoot
name = "Wrist Fluff"
icon_state = "fluffy_cuffs"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_ARM,BP_R_ARM)
body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/vr/chubby_belly
name = "Chubby Belly"

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