mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 20:16:55 +01:00
+18
-32
@@ -30,6 +30,7 @@
|
||||
#include "code\__HELPERS\sanitize_values.dm"
|
||||
#include "code\__HELPERS\text.dm"
|
||||
#include "code\__HELPERS\time.dm"
|
||||
#include "code\__HELPERS\timed_alerts.dm"
|
||||
#include "code\__HELPERS\type2type.dm"
|
||||
#include "code\__HELPERS\unsorted.dm"
|
||||
#include "code\_hooks\area.dm"
|
||||
@@ -118,7 +119,6 @@
|
||||
#include "code\datums\helper_datums\topic_input.dm"
|
||||
#include "code\datums\spells\area_teleport.dm"
|
||||
#include "code\datums\spells\charge.dm"
|
||||
#include "code\datums\spells\clown.dm"
|
||||
#include "code\datums\spells\conjure.dm"
|
||||
#include "code\datums\spells\construct_spells.dm"
|
||||
#include "code\datums\spells\dumbfire.dm"
|
||||
@@ -152,7 +152,6 @@
|
||||
#include "code\datums\wires\wires.dm"
|
||||
#include "code\defines\obj.dm"
|
||||
#include "code\defines\vox_sounds.dm"
|
||||
#include "code\defines\obj\hydro.dm"
|
||||
#include "code\defines\obj\weapon.dm"
|
||||
#include "code\defines\procs\AStar.dm"
|
||||
#include "code\defines\procs\captain_announce.dm"
|
||||
@@ -225,6 +224,7 @@
|
||||
#include "code\game\gamemodes\events\ninja_equipment.dm"
|
||||
#include "code\game\gamemodes\events\power_failure.dm"
|
||||
#include "code\game\gamemodes\events\space_ninja.dm"
|
||||
#include "code\game\gamemodes\events\spacevines.dm"
|
||||
#include "code\game\gamemodes\events\wormholes.dm"
|
||||
#include "code\game\gamemodes\events\holidays\Christmas.dm"
|
||||
#include "code\game\gamemodes\events\holidays\Holidays.dm"
|
||||
@@ -298,7 +298,6 @@
|
||||
#include "code\game\machinery\Beacon.dm"
|
||||
#include "code\game\machinery\bees_apiary.dm"
|
||||
#include "code\game\machinery\bees_items.dm"
|
||||
#include "code\game\machinery\biogenerator.dm"
|
||||
#include "code\game\machinery\buttons.dm"
|
||||
#include "code\game\machinery\cell_charger.dm"
|
||||
#include "code\game\machinery\cloning.dm"
|
||||
@@ -308,7 +307,6 @@
|
||||
#include "code\game\machinery\deployable.dm"
|
||||
#include "code\game\machinery\door_control.dm"
|
||||
#include "code\game\machinery\doppler_array.dm"
|
||||
#include "code\game\machinery\drying_rack.dm"
|
||||
#include "code\game\machinery\flasher.dm"
|
||||
#include "code\game\machinery\floodlight.dm"
|
||||
#include "code\game\machinery\Freezer.dm"
|
||||
@@ -327,7 +325,6 @@
|
||||
#include "code\game\machinery\OpTable.dm"
|
||||
#include "code\game\machinery\overview.dm"
|
||||
#include "code\game\machinery\PDApainter.dm"
|
||||
#include "code\game\machinery\podmen.dm"
|
||||
#include "code\game\machinery\portable_turret.dm"
|
||||
#include "code\game\machinery\recharger.dm"
|
||||
#include "code\game\machinery\rechargestation.dm"
|
||||
@@ -849,7 +846,6 @@
|
||||
#include "code\modules\customitems\item_defines.dm"
|
||||
#include "code\modules\customitems\item_spawning.dm"
|
||||
#include "code\modules\customitems\definitions\base.dm"
|
||||
#include "code\modules\destilery\main.dm"
|
||||
#include "code\modules\detectivework\detective_work.dm"
|
||||
#include "code\modules\detectivework\evidence.dm"
|
||||
#include "code\modules\detectivework\footprints_and_rag.dm"
|
||||
@@ -887,6 +883,7 @@
|
||||
#include "code\modules\events\radiation_storm.dm"
|
||||
#include "code\modules\events\rogue_drones.dm"
|
||||
#include "code\modules\events\space_ninja.dm"
|
||||
#include "code\modules\events\spacevine.dm"
|
||||
#include "code\modules\events\tear.dm"
|
||||
#include "code\modules\events\viral_infection.dm"
|
||||
#include "code\modules\events\viral_outbreak.dm"
|
||||
@@ -907,7 +904,6 @@
|
||||
#include "code\modules\events\tgevents\false_alarm.dm"
|
||||
#include "code\modules\events\tgevents\immovable_rod.dm"
|
||||
#include "code\modules\events\tgevents\mass_hallucination.dm"
|
||||
#include "code\modules\events\tgevents\spacevine.dm"
|
||||
#include "code\modules\events\tgevents\spider_infestation.dm"
|
||||
#include "code\modules\events\tgevents\vent_clog.dm"
|
||||
#include "code\modules\ext_scripts\irc.dm"
|
||||
@@ -916,6 +912,7 @@
|
||||
#include "code\modules\flufftext\Hallucination.dm"
|
||||
#include "code\modules\flufftext\TextFilters.dm"
|
||||
#include "code\modules\food\cereal_maker.dm"
|
||||
#include "code\modules\food\cooker.dm"
|
||||
#include "code\modules\food\customizables.dm"
|
||||
#include "code\modules\food\deep_fryer.dm"
|
||||
#include "code\modules\food\food_grill.dm"
|
||||
@@ -923,13 +920,23 @@
|
||||
#include "code\modules\food\oven.dm"
|
||||
#include "code\modules\food\recipes_microwave.dm"
|
||||
#include "code\modules\genetics\side_effects.dm"
|
||||
#include "code\modules\hydroponics\grown_inedible.dm"
|
||||
#include "code\modules\hydroponics\hydro_tools.dm"
|
||||
#include "code\modules\hydroponics\seed_datums.dm"
|
||||
#include "code\modules\hydroponics\seed_machines.dm"
|
||||
#include "code\modules\hydroponics\seed_mobs.dm"
|
||||
#include "code\modules\hydroponics\seeds.dm"
|
||||
#include "code\modules\hydroponics\vines.dm"
|
||||
#include "code\modules\library\lib_items.dm"
|
||||
#include "code\modules\library\lib_machines.dm"
|
||||
#include "code\modules\library\lib_readme.dm"
|
||||
#include "code\modules\liquid\splash_simulation.dm"
|
||||
#include "code\modules\media\jukebox.dm"
|
||||
#include "code\modules\media\machinery.dm"
|
||||
#include "code\modules\media\mediamanager.dm"
|
||||
#include "code\modules\media\broadcast\receiver.dm"
|
||||
#include "code\modules\media\broadcast\transmitter.dm"
|
||||
#include "code\modules\media\broadcast\receivers\radio.dm"
|
||||
#include "code\modules\media\broadcast\transmitters\broadcast.dm"
|
||||
#include "code\modules\mining\abandonedcrates.dm"
|
||||
#include "code\modules\mining\alloys.dm"
|
||||
#include "code\modules\mining\coins.dm"
|
||||
@@ -1213,9 +1220,6 @@
|
||||
#include "code\modules\power\terminal.dm"
|
||||
#include "code\modules\power\tracker.dm"
|
||||
#include "code\modules\power\turbine.dm"
|
||||
#include "code\modules\power\antimatter\containment_jar.dm"
|
||||
#include "code\modules\power\antimatter\control.dm"
|
||||
#include "code\modules\power\antimatter\shielding.dm"
|
||||
#include "code\modules\power\singularity\collector.dm"
|
||||
#include "code\modules\power\singularity\containment_field.dm"
|
||||
#include "code\modules\power\singularity\emitter.dm"
|
||||
@@ -1249,7 +1253,8 @@
|
||||
#include "code\modules\projectiles\guns\magic\staff.dm"
|
||||
#include "code\modules\projectiles\guns\magic\wand.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\automatic.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\bow.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\crossbow.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\launcher.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\pistol.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\pneumatic.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\revolver.dm"
|
||||
@@ -1358,6 +1363,7 @@
|
||||
#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm"
|
||||
#include "code\modules\research\xenoarchaeology\genetics\prehistoric_animals.dm"
|
||||
#include "code\modules\research\xenoarchaeology\genetics\prehistoric_plants.dm"
|
||||
#include "code\modules\research\xenoarchaeology\genetics\prehistoric_seeds.dm"
|
||||
#include "code\modules\research\xenoarchaeology\genetics\reconstitutor.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm"
|
||||
#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm"
|
||||
@@ -1452,31 +1458,11 @@
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_turfs.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Jungle\misc_helpers.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\areas.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\circuits_and_design.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_control.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_field.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_gen.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_monitor.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly_port.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_assembly_port_construction.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor_construction.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_control.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fuel_injector.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\fusion_reactions.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\radiation.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Rust\virtual_particle_catcher.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\circuits_and_designs.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\energy_field.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_capacitor.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_gen.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\ShieldGen\shield_gen_external.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\Laser2.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\LaserComputer.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Supermatter\ZeroPointLaser.dm"
|
||||
#include "code\WorkInProgress\Chinsky\ashtray.dm"
|
||||
#include "code\WorkInProgress\Chinsky\guestpass.dm"
|
||||
#include "code\WorkInProgress\Cib\MedicalSideEffects.dm"
|
||||
|
||||
@@ -67,7 +67,6 @@ var/jungle_plants_init = 0
|
||||
reagent_effects = shuffle(reagent_effects)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit
|
||||
seed = ""
|
||||
name = "jungle fruit"
|
||||
desc = "It smells weird and looks off."
|
||||
icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi'
|
||||
|
||||
@@ -203,6 +203,23 @@
|
||||
/obj/spacepod/random
|
||||
icon_state = "pod_civ"
|
||||
// placeholder
|
||||
|
||||
/obj/spacepod/sec
|
||||
name = "\improper security spacepod"
|
||||
desc = "An armed security spacepod."
|
||||
icon_state = "pod_mil"
|
||||
|
||||
/obj/spacepod/sec/New()
|
||||
..()
|
||||
var/obj/item/device/spacepod_equipment/weaponry/taser/burst/T = new /obj/item/device/spacepod_equipment/weaponry/taser/burst
|
||||
T.loc = equipment_system
|
||||
equipment_system.weapon_system = T
|
||||
equipment_system.weapon_system.my_atom = T
|
||||
var/path = text2path("[T.type]/proc/fire_weapon_system")
|
||||
if(path)
|
||||
verbs += path//obj/spacepod/proc/fire_weapons
|
||||
return
|
||||
|
||||
/obj/spacepod/random/New()
|
||||
..()
|
||||
icon_state = pick("pod_civ", "pod_black", "pod_mil", "pod_synd", "pod_gold", "pod_industrial")
|
||||
|
||||
+6
-1
@@ -15,12 +15,14 @@ Attach to transfer valve and open. BOOM.
|
||||
var/fire_dmi = 'icons/effects/fire.dmi'
|
||||
var/fire_sprite = "fire"
|
||||
var/ashtype = /obj/effect/decal/cleanable/ash
|
||||
var/fire_time_min = 5 // Seconds
|
||||
var/fire_time_max = 10 // Seconds
|
||||
|
||||
/atom/proc/ignite(var/temperature)
|
||||
on_fire=1
|
||||
visible_message("\The [src] bursts into flame!")
|
||||
overlays += image(fire_dmi,fire_sprite)
|
||||
spawn(rand(3,10) SECONDS)
|
||||
spawn(rand(fire_time_min,fire_time_max) SECONDS)
|
||||
if(!on_fire)
|
||||
return
|
||||
new ashtype(src.loc)
|
||||
@@ -125,6 +127,9 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
||||
loc.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
|
||||
for(var/atom/A in loc)
|
||||
A.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
|
||||
// Burn the turf, too.
|
||||
S.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
|
||||
|
||||
//spread
|
||||
for(var/direction in cardinal)
|
||||
var/turf/simulated/enemy_tile = get_step(S, direction)
|
||||
|
||||
@@ -17,6 +17,18 @@ proc/random_hair_style(gender, species = "Human")
|
||||
|
||||
return h_style
|
||||
|
||||
/proc/GetOppositeDir(var/dir)
|
||||
switch(dir)
|
||||
if(NORTH) return SOUTH
|
||||
if(SOUTH) return NORTH
|
||||
if(EAST) return WEST
|
||||
if(WEST) return EAST
|
||||
if(SOUTHWEST) return NORTHEAST
|
||||
if(NORTHWEST) return SOUTHEAST
|
||||
if(NORTHEAST) return SOUTHWEST
|
||||
if(SOUTHEAST) return NORTHWEST
|
||||
return 0
|
||||
|
||||
proc/random_facial_hair_style(gender, species = "Human")
|
||||
var/f_style = "Shaved"
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/client/var/timed_alert/timed_alert
|
||||
|
||||
/client/proc/timed_alert(question as text, title as text, default as text, time = 300, \
|
||||
choice1 as text, choice2 as text, choice3 as text)
|
||||
|
||||
if(timed_alert) del(timed_alert)
|
||||
var/timed_alert/ref_alert = new
|
||||
timed_alert = ref_alert
|
||||
|
||||
var/ref_result
|
||||
|
||||
ref_result = ref_alert.timed_alert(src, question, title, time, choice1, choice2, choice3)
|
||||
if (!ref_result) ref_result = default
|
||||
|
||||
if (ref_alert) del(ref_alert)
|
||||
|
||||
return ref_result
|
||||
|
||||
|
||||
/mob/proc/timed_alert(question as text, title as text, default as text, time as num, \
|
||||
choice1 as text, choice2 as text, choice3 as text)
|
||||
|
||||
if (client) client.timed_alert(question, title, default, time, choice1, choice2, choice3)
|
||||
return
|
||||
|
||||
|
||||
|
||||
/timed_alert/proc/timed_alert(client/ref_client, question, title, time, choice1, choice2, choice3)
|
||||
if (!ref_client) return
|
||||
spawn (time) del src // When src is deleted, the proc ends immediately. The alert itself closes.
|
||||
|
||||
var/ref_answer
|
||||
ref_answer = alert(ref_client, question, title, choice1, choice2, choice3)
|
||||
|
||||
if(!ref_client || !ref_answer) return
|
||||
else return ref_answer
|
||||
|
||||
@@ -1013,7 +1013,9 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
|
||||
del(O) // prevents multiple shuttle corners from stacking
|
||||
continue
|
||||
if(!istype(O,/obj)) continue
|
||||
O.loc = X
|
||||
O.loc.Exited(O)
|
||||
O.setLoc(X,teleported=1)
|
||||
O.loc.Entered(O)
|
||||
for(var/mob/M in T)
|
||||
if(!M.move_on_shuttle)
|
||||
continue
|
||||
|
||||
+33
-5
@@ -79,12 +79,15 @@
|
||||
than anything else in the game, atoms have separate procs
|
||||
for AI shift, ctrl, and alt clicking.
|
||||
*/
|
||||
|
||||
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
|
||||
A.AIShiftClick(src)
|
||||
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
|
||||
A.AICtrlClick(src)
|
||||
/mob/living/silicon/ai/AltClickOn(var/atom/A)
|
||||
A.AIAltClick(src)
|
||||
/mob/living/silicon/ai/MiddleClickOn(var/atom/A)
|
||||
A.AIMiddleClick(src)
|
||||
|
||||
/*
|
||||
The following criminally helpful code is just the previous code cleaned up;
|
||||
@@ -101,7 +104,6 @@
|
||||
Topic("aiDisable=7", list("aiDisable"="7"), 1)
|
||||
return
|
||||
|
||||
|
||||
/atom/proc/AICtrlClick()
|
||||
return
|
||||
|
||||
@@ -111,18 +113,44 @@
|
||||
else
|
||||
Topic("aiDisable=4", list("aiDisable"="4"), 1)
|
||||
|
||||
/obj/machinery/power/apc/AICtrlClick() // turns off APCs.
|
||||
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
|
||||
Topic("breaker=1", list("breaker"="1"), 0) // 0 meaning no window (consistency! wait...)
|
||||
|
||||
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
|
||||
src.enabled = !src.enabled
|
||||
src.updateTurrets()
|
||||
|
||||
/atom/proc/AIAltClick()
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors.
|
||||
/obj/machinery/door/airlock/AIAltClick() // Electrifies doors.
|
||||
if(emagged)
|
||||
return
|
||||
if(!secondsElectrified)
|
||||
// permenant shock
|
||||
// permanent shock
|
||||
Topic("aiEnable=6", list("aiEnable"="6"), 1) // 1 meaning no window (consistency!)
|
||||
else
|
||||
// disable/6 is not in Topic; disable/5 disables both temporary and permenant shock
|
||||
// disable/6 is not in Topic; disable/5 disables both temporary and permanent shock
|
||||
Topic("aiDisable=5", list("aiDisable"="5"), 1)
|
||||
return
|
||||
|
||||
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
|
||||
src.lethal = !src.lethal
|
||||
src.updateTurrets()
|
||||
|
||||
/atom/proc/AIMiddleClick()
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
|
||||
if(!src.lights)
|
||||
Topic("aiEnable=10", list("aiEnable"="10"), 1) // 1 meaning no window (consistency!)
|
||||
else
|
||||
Topic("aiDisable=10", list("aiDisable"="10"), 1)
|
||||
return
|
||||
|
||||
//
|
||||
// Override AdjacentQuick for AltClicking
|
||||
//
|
||||
|
||||
/mob/living/silicon/ai/TurfAdjacent(var/turf/T)
|
||||
return (cameranet && cameranet.checkTurfVis(T))
|
||||
|
||||
@@ -247,14 +247,17 @@
|
||||
|
||||
/atom/proc/AltClick(var/mob/user)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && T.Adjacent(user))
|
||||
if(user.listed_turf == T)
|
||||
if(T && user.TurfAdjacent(T))
|
||||
if(user. == T)
|
||||
user.listed_turf = null
|
||||
else
|
||||
user.listed_turf = T
|
||||
user.client.statpanel = T.name
|
||||
return
|
||||
|
||||
/mob/proc/TurfAdjacent(var/turf/T)
|
||||
return T.Adjacent(src)
|
||||
|
||||
/*
|
||||
Misc helpers
|
||||
|
||||
|
||||
+23
-15
@@ -13,6 +13,8 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "intent_"+mymob.a_intent
|
||||
using.screen_loc = ui_acti
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 20
|
||||
src.adding += using
|
||||
action_intent = using
|
||||
@@ -27,6 +29,7 @@
|
||||
using.name = "help"
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
src.adding += using
|
||||
help_intent = using
|
||||
@@ -38,6 +41,7 @@
|
||||
using.name = "disarm"
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
src.adding += using
|
||||
disarm_intent = using
|
||||
@@ -49,6 +53,7 @@
|
||||
using.name = "grab"
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
src.adding += using
|
||||
grab_intent = using
|
||||
@@ -60,6 +65,7 @@
|
||||
using.name = "harm"
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
src.adding += using
|
||||
hurt_intent = using
|
||||
@@ -437,7 +443,7 @@
|
||||
mymob.flash.icon = ui_style
|
||||
mymob.flash.icon_state = "blank"
|
||||
mymob.flash.name = "flash"
|
||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||
mymob.flash.screen_loc = "1,1 to 17,17"
|
||||
mymob.flash.layer = 17
|
||||
|
||||
mymob.pain = new /obj/screen( null )
|
||||
@@ -451,23 +457,24 @@
|
||||
|
||||
//Handle the gun settings buttons
|
||||
mymob.gun_setting_icon = new /obj/screen/gun/mode(null)
|
||||
//mymob.gun_setting_icon.color = ui_color
|
||||
mymob.gun_setting_icon.alpha = ui_alpha
|
||||
|
||||
mymob.item_use_icon = new /obj/screen/gun/item(null)
|
||||
//mymob.item_use_icon.color = ui_color
|
||||
mymob.item_use_icon.alpha = ui_alpha
|
||||
|
||||
mymob.gun_move_icon = new /obj/screen/gun/move(null)
|
||||
//mymob.gun_move_icon.color = ui_color
|
||||
mymob.gun_move_icon.alpha = ui_alpha
|
||||
|
||||
mymob.gun_run_icon = new /obj/screen/gun/run(null)
|
||||
//mymob.gun_run_icon.color = ui_color
|
||||
mymob.gun_run_icon.alpha = ui_alpha
|
||||
|
||||
if (mymob.client)
|
||||
if (mymob.client.gun_mode) // If in aim mode, correct the sprite
|
||||
mymob.gun_setting_icon.dir = 2
|
||||
for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons
|
||||
if (G.target)
|
||||
mymob.item_use_icon = new /obj/screen/gun/item(null)
|
||||
if (mymob.client.target_can_click)
|
||||
mymob.item_use_icon.dir = 1
|
||||
src.adding += mymob.item_use_icon
|
||||
mymob.gun_move_icon = new /obj/screen/gun/move(null)
|
||||
if (mymob.client.target_can_move)
|
||||
mymob.gun_move_icon.dir = 1
|
||||
mymob.gun_run_icon = new /obj/screen/gun/run(null)
|
||||
if (mymob.client.target_can_run)
|
||||
mymob.gun_run_icon.dir = 1
|
||||
src.adding += mymob.gun_run_icon
|
||||
src.adding += mymob.gun_move_icon
|
||||
|
||||
|
||||
mymob.client.screen = null
|
||||
@@ -510,6 +517,7 @@
|
||||
I = U.hastie
|
||||
if(I.icon_action_button)
|
||||
var/obj/screen/item_action/A = new(hud_used)
|
||||
|
||||
//A.icon = 'icons/mob/screen1_action.dmi'
|
||||
//A.icon_state = I.icon_action_button
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
client.screen -= hud_used.power_action_list
|
||||
|
||||
hud_used.power_action_list = list()
|
||||
for(var/obj/effect/proc_holder/spell/S in spell_list)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/S in spell_list)
|
||||
if(S.icon_power_button)
|
||||
var/obj/screen/power_action/P = new(hud_used)
|
||||
P.icon = 'icons/mob/screen1_action.dmi'
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
return 1
|
||||
|
||||
/obj/screen/power_action
|
||||
var/obj/effect/proc_holder/spell/owner
|
||||
var/obj/effect/proc_holder/spell/wizard/owner
|
||||
|
||||
/obj/screen/power_action/Click()
|
||||
owner.Click()
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
NT.xo = U.x - T.x
|
||||
spawn( 1)
|
||||
NT.process()
|
||||
next_attack = world.time + 50
|
||||
next_attack = world.time + 100
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/NeuroAOE(atom/A)
|
||||
if(world.time < next_attack)
|
||||
@@ -146,7 +146,7 @@
|
||||
D.color = "#00FF21"
|
||||
var/turf/my_target = pick(the_targets)
|
||||
for(var/b=0, b<5, b++)
|
||||
step_towards(D,my_target)
|
||||
if(!step_towards(D,my_target)) return
|
||||
if(!D) return
|
||||
// D.reagents.reaction(get_turf(D))
|
||||
for(var/atom/atm in get_turf(D))
|
||||
@@ -155,13 +155,18 @@
|
||||
return
|
||||
if(istype(atm, /mob/living/carbon))
|
||||
var/mob/living/carbon/C = atm
|
||||
C.Weaken(5)
|
||||
C.take_overall_damage(20)
|
||||
C << "You were drenched with neurotoxin!"
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(istype(H.wear_suit, /obj/item/clothing/suit/space) && istype(H.head, /obj/item/clothing/head/helmet/space))
|
||||
return
|
||||
else
|
||||
C.Weaken(5)
|
||||
C.adjustToxLoss(20)
|
||||
C << "You were drenched with neurotoxin!"
|
||||
// D.reagents.reaction(atm, TOUCH) // Touch, since we sprayed it.
|
||||
if(D.loc == my_target) break
|
||||
sleep(2)
|
||||
next_attack = world.time + 50
|
||||
next_attack = world.time + 100
|
||||
|
||||
|
||||
// Babby aliens
|
||||
|
||||
@@ -85,9 +85,6 @@ datum/controller/game_controller/proc/setup()
|
||||
|
||||
color_windows_init()
|
||||
|
||||
//Create the mining ore distribution map.
|
||||
asteroid_ore_map = new /datum/ore_distribution()
|
||||
asteroid_ore_map.populate_distribution_map()
|
||||
|
||||
spawn(0)
|
||||
if(ticker)
|
||||
@@ -117,6 +114,14 @@ datum/controller/game_controller/proc/setup_objects()
|
||||
var/obj/machinery/atmospherics/unary/vent_scrubber/T = U
|
||||
T.broadcast_status()
|
||||
|
||||
//Create the mining ore distribution map.
|
||||
asteroid_ore_map = new /datum/ore_distribution()
|
||||
asteroid_ore_map.populate_distribution_map()
|
||||
|
||||
|
||||
//Set up roundstart seed list.
|
||||
populate_seed_list()
|
||||
|
||||
world << "\red \b Initializations complete."
|
||||
sleep(-1)
|
||||
|
||||
@@ -219,10 +224,12 @@ datum/controller/game_controller/proc/process()
|
||||
processEvents()
|
||||
events_cost = (world.timeofday - timer) / 10
|
||||
|
||||
/*
|
||||
//PUDDLES
|
||||
timer = world.timeofday
|
||||
processPuddles()
|
||||
puddles_cost = (world.timeofday - timer) / 10
|
||||
*/
|
||||
|
||||
//TICKER
|
||||
timer = world.timeofday
|
||||
@@ -320,6 +327,7 @@ datum/controller/game_controller/proc/process()
|
||||
|
||||
checkEvent()
|
||||
|
||||
/*
|
||||
/datum/controller/game_controller/proc/processPuddles()
|
||||
last_thing_processed = /datum/puddle
|
||||
|
||||
@@ -327,6 +335,7 @@ datum/controller/game_controller/proc/process()
|
||||
if (Puddle)
|
||||
Puddle.process()
|
||||
continue
|
||||
*/
|
||||
|
||||
datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now.
|
||||
var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n"
|
||||
|
||||
+18
-18
@@ -48,7 +48,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
var/icon_power_button
|
||||
var/power_button_name
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
|
||||
/obj/effect/proc_holder/spell/wizard/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
|
||||
|
||||
if(!(src in user.spell_list))
|
||||
user << "<span class='warning'>You shouldn't have this spell! Something's wrong.</span>"
|
||||
@@ -77,7 +77,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if(istype(usr.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
usr << "Mmmf mrrfff!"
|
||||
return 0
|
||||
var/obj/effect/proc_holder/spell/noclothes/spell = locate() in user.spell_list
|
||||
var/obj/effect/proc_holder/spell/wizard/noclothes/spell = locate() in user.spell_list
|
||||
if(clothes_req && !(spell && istype(spell)))//clothes check
|
||||
if(!istype(usr, /mob/living/carbon/human))
|
||||
usr << "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans."
|
||||
@@ -103,7 +103,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount
|
||||
/obj/effect/proc_holder/spell/wizard/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount
|
||||
switch(invocation_type)
|
||||
if("shout")
|
||||
if(prob(50))//Auto-mute? Fuck that noise
|
||||
@@ -116,26 +116,26 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
else
|
||||
user.whisper(replacetext(invocation," ","`"))
|
||||
|
||||
/obj/effect/proc_holder/spell/New()
|
||||
/obj/effect/proc_holder/spell/wizard/New()
|
||||
..()
|
||||
|
||||
charge_counter = charge_max
|
||||
|
||||
/obj/effect/proc_holder/spell/Click()
|
||||
/obj/effect/proc_holder/spell/wizard/Click()
|
||||
if(cast_check())
|
||||
choose_targets()
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/choose_targets(mob/user = usr) //depends on subtype - /targeted or /aoe_turf
|
||||
/obj/effect/proc_holder/spell/wizard/proc/choose_targets(mob/user = usr) //depends on subtype - /targeted or /aoe_turf
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/start_recharge()
|
||||
/obj/effect/proc_holder/spell/wizard/proc/start_recharge()
|
||||
while(charge_counter < charge_max)
|
||||
sleep(1)
|
||||
charge_counter++
|
||||
usr.update_power_buttons()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
|
||||
/obj/effect/proc_holder/spell/wizard/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
|
||||
before_cast(targets)
|
||||
invocation()
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>")
|
||||
@@ -148,7 +148,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
cast(targets)
|
||||
after_cast(targets)
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/before_cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/proc/before_cast(list/targets)
|
||||
if(overlay)
|
||||
for(var/atom/target in targets)
|
||||
var/location
|
||||
@@ -164,7 +164,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
spawn(overlay_lifespan)
|
||||
del(spell)
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/after_cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/proc/after_cast(list/targets)
|
||||
for(var/atom/target in targets)
|
||||
var/location
|
||||
if(istype(target,/mob/living))
|
||||
@@ -188,13 +188,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
smoke.start()
|
||||
usr.update_power_buttons()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/proc/cast(list/targets)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/critfail(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/proc/critfail(list/targets)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge
|
||||
/obj/effect/proc_holder/spell/wizard/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge
|
||||
switch(charge_type)
|
||||
if("recharge")
|
||||
charge_counter = charge_max
|
||||
@@ -205,7 +205,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types
|
||||
/obj/effect/proc_holder/spell/wizard/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types
|
||||
switch(type)
|
||||
if("bruteloss")
|
||||
target.adjustBruteLoss(amount)
|
||||
@@ -225,15 +225,15 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob
|
||||
/obj/effect/proc_holder/spell/wizard/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob
|
||||
var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range
|
||||
var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast
|
||||
var/include_user = 0 //if it includes usr in the target list
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends)
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf //affects all turfs in view or range (depends)
|
||||
var/inner_radius = -1 //for all your ring spell needs
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/choose_targets(mob/user = usr)
|
||||
var/list/targets = list()
|
||||
|
||||
switch(max_targets)
|
||||
@@ -280,7 +280,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/choose_targets(mob/user = usr)
|
||||
var/list/targets = list()
|
||||
|
||||
for(var/turf/target in view_or_range(range,user,selection_type))
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/area_teleport
|
||||
name = "Area teleport"
|
||||
desc = "This spell teleports you to a type of area of your selection."
|
||||
|
||||
var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list
|
||||
var/invocation_area = 1 //if the invocation appends the selected area
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/area_teleport/perform(list/targets, recharge = 1)
|
||||
var/thearea = before_cast(targets)
|
||||
if(!thearea || !cast_check(1))
|
||||
revert_cast()
|
||||
@@ -17,7 +17,7 @@
|
||||
cast(targets,thearea)
|
||||
after_cast(targets)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/before_cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/area_teleport/before_cast(list/targets)
|
||||
var/A = null
|
||||
|
||||
if(!randomise_selection)
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
return thearea
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/area_teleport/cast(list/targets,area/thearea)
|
||||
for(var/mob/living/target in targets)
|
||||
var/list/L = list()
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/area_teleport/invocation(area/chosenarea = null)
|
||||
if(!invocation_area || !chosenarea)
|
||||
..()
|
||||
else
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/charge
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/charge
|
||||
name = "Charge"
|
||||
desc = "This spell can be used to charge up spent magical artifacts, among other things."
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
include_user = 1
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/charge/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand())
|
||||
var/charged_item = null
|
||||
@@ -23,7 +23,7 @@
|
||||
if(G.affecting)
|
||||
var/mob/M = G.affecting
|
||||
if(M.spell_list.len != 0)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/S in M.spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
M <<"<span class='notice'>you feel raw magic flowing through you, it feels good!</span>"
|
||||
else
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/obj/effect/proc_holder/spell/targeted/embiggen
|
||||
name = "Embiggen"
|
||||
desc = "Make sure everyone knows you're there!"
|
||||
charge_max = 600
|
||||
|
||||
clothes_req = 0
|
||||
stat_allowed = 0
|
||||
invocation_type = "none"
|
||||
range = -1
|
||||
selection_type = "range"
|
||||
|
||||
icon_power_button = "genetic_view"
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets)
|
||||
if(!ishuman(usr))
|
||||
return
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
var/matrix/M = matrix()
|
||||
M.Scale(2)
|
||||
target.transform = M
|
||||
|
||||
spawn(300)
|
||||
M = matrix()
|
||||
target.transform = M
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure
|
||||
name = "Conjure"
|
||||
desc = "This spell conjures objs of the specified types in range."
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
//should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example
|
||||
var/delay = 1//Go Go Gadget Inheritance
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/cast(list/targets)
|
||||
|
||||
for(var/turf/T in targets)
|
||||
if(T.density && !summon_ignore_density)
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/summonEdSwarm //test purposes
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/summonEdSwarm //test purposes
|
||||
name = "Dispense Wizard Justice"
|
||||
desc = "This spell dispenses wizard justice."
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//////////////////////////////Construct Spells/////////////////////////
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/construct/lesser
|
||||
charge_max = 1800
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/floor
|
||||
name = "Floor Construction"
|
||||
desc = "This spell constructs a cult floor"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
summon_type = list(/turf/simulated/floor/engine/cult)
|
||||
centcom_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/wall
|
||||
name = "Lesser Construction"
|
||||
desc = "This spell constructs a cult wall"
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
summon_type = list(/turf/simulated/wall/cult)
|
||||
centcom_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/wall/reinforced
|
||||
name = "Greater Construction"
|
||||
desc = "This spell constructs a reinforced metal wall"
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
summon_type = list(/turf/simulated/wall/r_wall)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/soulstone
|
||||
name = "Summon Soulstone"
|
||||
desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space"
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
summon_type = list(/obj/item/device/soulstone)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/lesserforcewall
|
||||
name = "Shield"
|
||||
desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire"
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
summon_lifespan = 200
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt/shift
|
||||
name = "Phase Shift"
|
||||
desc = "This spell allows you to pass through walls"
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
centcom_cancast = 0 //Stop people from getting to centcom
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/projectile/magic_missile/lesser
|
||||
name = "Lesser Magic Missile"
|
||||
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/dumbfire
|
||||
/obj/effect/proc_holder/spell/wizard/dumbfire
|
||||
|
||||
var/projectile_type = ""
|
||||
var/activate_on_collision = 1
|
||||
@@ -20,7 +20,7 @@
|
||||
var/proj_lifespan = 100 //in deciseconds * proj_step_delay
|
||||
var/proj_step_delay = 1 //lower = faster
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/dumbfire/choose_targets(mob/user = usr)
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
for(var/i = 1; i < range; i++)
|
||||
@@ -30,16 +30,16 @@
|
||||
T = new_turf
|
||||
perform(list(T))
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/dumbfire/cast(list/targets, mob/user = usr)
|
||||
|
||||
for(var/turf/target in targets)
|
||||
spawn(0)
|
||||
var/obj/effect/proc_holder/spell/targeted/projectile
|
||||
var/obj/effect/proc_holder/spell/wizard/targeted/projectile
|
||||
if(istext(proj_type))
|
||||
var/projectile_type = text2path(proj_type)
|
||||
projectile = new projectile_type(user)
|
||||
if(istype(proj_type,/obj/effect/proc_holder/spell))
|
||||
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
|
||||
projectile = new /obj/effect/proc_holder/spell/wizard/targeted/trigger(user)
|
||||
projectile:linked_spells += proj_type
|
||||
projectile.icon = proj_icon
|
||||
projectile.icon_state = proj_icon_state
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/obj/effect/proc_holder/spell/targeted/emplosion
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/emplosion
|
||||
name = "Emplosion"
|
||||
desc = "This spell emplodes an area."
|
||||
|
||||
var/emp_heavy = 2
|
||||
var/emp_light = 3
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/emplosion/cast(list/targets)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
empulse(target.loc, emp_heavy, emp_light)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt
|
||||
name = "Ethereal Jaunt"
|
||||
desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls."
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
icon_power_button = "spell_jaunt"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
|
||||
for(var/mob/living/target in targets)
|
||||
spawn(0)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/explosion
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/explosion
|
||||
name = "Explosion"
|
||||
desc = "This spell explodes an area."
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/ex_heavy = 2
|
||||
var/ex_light = 3
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/explosion/cast(list/targets)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
explosion(target.loc,ex_severe,ex_heavy,ex_light)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/genetic
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/genetic
|
||||
name = "Genetic"
|
||||
desc = "This spell inflicts a set of mutations and disabilities upon the target."
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
6th bit - ?
|
||||
*/
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/genetic/cast(list/targets)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
for(var/x in mutations)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/horsemask
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/horsemask
|
||||
name = "Curse of the Horseman"
|
||||
desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes."
|
||||
school = "transmutation"
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
icon_power_button = "spell_horse"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/horsemask/cast(list/targets, mob/user = usr)
|
||||
if(!targets.len)
|
||||
user << "<span class='notice'>No target found in range.</span>"
|
||||
return
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler
|
||||
name = "Inflict Handler"
|
||||
desc = "This spell blinds and/or destroys/damages/heals and/or weakens/stuns the target."
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
var/summon_type = null //this will put an obj at the target's location
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/cast(list/targets)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
switch(destroys)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/aoe_turf/knock
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/knock
|
||||
name = "Knock"
|
||||
desc = "This spell opens nearby doors and does not require wizard garb."
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
icon_power_button = "spell_knock"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/knock/cast(list/targets)
|
||||
for(var/turf/T in targets)
|
||||
for(var/obj/machinery/door/door in T.contents)
|
||||
spawn(1)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/mind_transfer
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/mind_transfer
|
||||
name = "Mind Transfer"
|
||||
desc = "This spell allows the user to switch bodies with a target."
|
||||
|
||||
@@ -25,7 +25,7 @@ Urist: I don't feel like figuring out how you store object spells so I'm leaving
|
||||
Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering.
|
||||
Also, you never added distance checking after target is selected. I've went ahead and did that.
|
||||
*/
|
||||
/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/mind_transfer/cast(list/targets,mob/user = usr)
|
||||
if(!targets.len)
|
||||
user << "No mind found."
|
||||
return
|
||||
@@ -61,7 +61,7 @@ Also, you never added distance checking after target is selected. I've went ahea
|
||||
|
||||
//SPELL LOSS BEGIN
|
||||
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
|
||||
var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.
|
||||
var/obj/effect/proc_holder/spell/wizard/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.
|
||||
var/list/checked_spells = user.spell_list
|
||||
checked_spells -= m_transfer //Remove Mind Transfer from the list.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/projectile
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/projectile
|
||||
name = "Projectile"
|
||||
desc = "This spell summons projectiles which try to hit the targets."
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/proj_trail_icon = 'icons/obj/wizard.dmi'
|
||||
var/proj_trail_icon_state = "trail"
|
||||
|
||||
var/proj_type = "/obj/effect/proc_holder/spell/targeted" //IMPORTANT use only subtypes of this
|
||||
var/proj_type = "/obj/effect/proc_holder/spell/wizard/targeted" //IMPORTANT use only subtypes of this
|
||||
|
||||
var/proj_lingering = 0 //if it lingers or disappears upon hitting an obstacle
|
||||
var/proj_homing = 1 //if it follows the target
|
||||
@@ -21,16 +21,16 @@
|
||||
var/proj_lifespan = 15 //in deciseconds * proj_step_delay
|
||||
var/proj_step_delay = 1 //lower = faster
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/cast(list/targets, mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/projectile/cast(list/targets, mob/user = usr)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
spawn(0)
|
||||
var/obj/effect/proc_holder/spell/targeted/projectile
|
||||
var/obj/effect/proc_holder/spell/wizard/targeted/projectile
|
||||
if(istext(proj_type))
|
||||
var/projectile_type = text2path(proj_type)
|
||||
projectile = new projectile_type(user)
|
||||
if(istype(proj_type,/obj/effect/proc_holder/spell))
|
||||
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
|
||||
projectile = new /obj/effect/proc_holder/spell/wizard/targeted/trigger(user)
|
||||
projectile:linked_spells += proj_type
|
||||
projectile.icon = proj_icon
|
||||
projectile.icon_state = proj_icon_state
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
/obj/effect/proc_holder/spell/targeted/trigger
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/trigger
|
||||
name = "Trigger"
|
||||
desc = "This spell triggers another spell or a few."
|
||||
|
||||
var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly
|
||||
var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/New()
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/trigger/New()
|
||||
..()
|
||||
|
||||
for(var/spell in starting_spells)
|
||||
var/spell_to_add = text2path(spell)
|
||||
new spell_to_add(src) //should result in adding to contents, needs testing
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/Destroy()
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/trigger/Destroy()
|
||||
for(var/spell in contents)
|
||||
del(spell)
|
||||
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/trigger/cast(list/targets)
|
||||
for(var/mob/living/target in targets)
|
||||
for(var/obj/effect/proc_holder/spell/spell in contents)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/spell in contents)
|
||||
spell.perform(list(target),0)
|
||||
for(var/obj/effect/proc_holder/spell/spell in linked_spells)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/spell in linked_spells)
|
||||
spell.perform(list(target),0)
|
||||
|
||||
return
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/turf_teleport
|
||||
name = "Turf Teleport"
|
||||
desc = "This spell teleports the target to the turf in range."
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
var/include_space = 0 //whether it includes space tiles in possible teleport locations
|
||||
var/include_dense = 0 //whether it includes dense tiles in possible teleport locations
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/turf_teleport/cast(list/targets)
|
||||
for(var/mob/living/target in targets)
|
||||
var/list/turfs = new/list()
|
||||
for(var/turf/T in range(target,outer_tele_radius))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/projectile/magic_missile
|
||||
name = "Magic Missile"
|
||||
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
proj_icon_state = "magicm"
|
||||
proj_name = "a magic missile"
|
||||
proj_lingering = 1
|
||||
proj_type = "/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile"
|
||||
proj_type = "/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/magic_missile"
|
||||
|
||||
proj_lifespan = 20
|
||||
proj_step_delay = 5
|
||||
@@ -26,15 +26,15 @@
|
||||
|
||||
icon_power_button = "spell_missile"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/magic_missile
|
||||
amt_weakened = 5
|
||||
amt_dam_fire = 10
|
||||
|
||||
/obj/effect/proc_holder/spell/noclothes
|
||||
/obj/effect/proc_holder/spell/wizard/noclothes
|
||||
name = "No Clothes"
|
||||
desc = "This is a placeholder for knowing if you dont need clothes for any spell"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/mutate
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/genetic/mutate
|
||||
name = "Mutate"
|
||||
desc = "This spell causes you to turn into a hulk and gain laser vision for a short while."
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
duration = 300
|
||||
cooldown_min = 300 //25 deciseconds reduction per rank
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/disintegrate
|
||||
name = "Disintegrate"
|
||||
desc = "This spell instantly kills somebody adjacent to you with the vilest of magick."
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
icon_power_button = "spell_disintegrate"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/smoke
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/smoke
|
||||
name = "Smoke"
|
||||
desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb."
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
icon_power_button = "spell_smoke"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/emplosion/disable_tech
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/emplosion/disable_tech
|
||||
name = "Disable Tech"
|
||||
desc = "This spell disables all weapons, cameras and most other technology in range."
|
||||
charge_max = 400
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
icon_power_button = "spell_tech"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport/blink
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/turf_teleport/blink
|
||||
name = "Blink"
|
||||
desc = "This spell randomly teleports you a short distance."
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
icon_power_button = "spell_blink"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/teleport
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/area_teleport/teleport
|
||||
name = "Teleport"
|
||||
desc = "This spell teleports you to a type of area of your selection."
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
|
||||
icon_power_button = "spell_teleport"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/forcewall
|
||||
name = "Forcewall"
|
||||
desc = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
icon_power_button = "spell_forcewall"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/carp
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/carp
|
||||
name = "Summon Carp"
|
||||
desc = "This spell conjures a simple carp."
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
summon_type = list(/mob/living/simple_animal/hostile/carp)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/construct
|
||||
name = "Artificer"
|
||||
desc = "This spell conjures a construct which may be controlled by Shades"
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
summon_type = list(/obj/structure/constructshell)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/creature
|
||||
name = "Summon Creature Swarm"
|
||||
desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth"
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
|
||||
summon_type = list(/mob/living/simple_animal/hostile/creature)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/blind
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/trigger/blind
|
||||
name = "Blind"
|
||||
desc = "This spell temporarily blinds a single person and does not require wizard garb."
|
||||
|
||||
@@ -217,19 +217,19 @@
|
||||
message = "\blue Your eyes cry out in pain!"
|
||||
cooldown_min = 50 //12 deciseconds reduction per rank
|
||||
|
||||
starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/targeted/genetic/blind")
|
||||
starting_spells = list("/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/wizard/targeted/genetic/blind")
|
||||
|
||||
icon_power_button = "spell_blind"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/blind
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/blind
|
||||
amt_eye_blind = 10
|
||||
amt_eye_blurry = 20
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/blind
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/genetic/blind
|
||||
disabilities = 1
|
||||
duration = 300
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/flesh_to_stone
|
||||
name = "Flesh to Stone"
|
||||
desc = "This spell turns a single person into an inert statue for a long period of time."
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
|
||||
icon_power_button = "spell_stone"
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
/obj/effect/proc_holder/spell/wizard/dumbfire/fireball
|
||||
name = "Fireball"
|
||||
desc = "This spell fires a fireball at a target and does not require wizard garb."
|
||||
|
||||
@@ -260,22 +260,22 @@
|
||||
|
||||
proj_icon_state = "fireball"
|
||||
proj_name = "a fireball"
|
||||
proj_type = "/obj/effect/proc_holder/spell/turf/fireball"
|
||||
proj_type = "/obj/effect/proc_holder/spell/wizard/turf/fireball"
|
||||
|
||||
proj_lifespan = 200
|
||||
proj_step_delay = 1
|
||||
|
||||
icon_power_button = "spell_fireball"
|
||||
|
||||
/obj/effect/proc_holder/spell/turf/fireball/cast(var/turf/T)
|
||||
/obj/effect/proc_holder/spell/wizard/turf/fireball/cast(var/turf/T)
|
||||
explosion(T, -1, 0, 2, 0)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/fireball
|
||||
amt_dam_brute = 20
|
||||
amt_dam_fire = 25
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/explosion/fireball
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/explosion/fireball
|
||||
ex_severe = -1
|
||||
ex_heavy = 0
|
||||
ex_light = 2
|
||||
|
||||
@@ -254,6 +254,22 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containername = "MULEbot Crate"
|
||||
group = "Operations"
|
||||
|
||||
/datum/supply_packs/cargotrain
|
||||
name = "Cargo Train Tug"
|
||||
contains = list(/obj/vehicle/train/cargo/engine)
|
||||
cost = 30
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Cargo Train Tug Crate"
|
||||
group = "Operations"
|
||||
|
||||
/datum/supply_packs/cargotrailer
|
||||
name = "Cargo Train Trolley"
|
||||
contains = list(/obj/vehicle/train/cargo/trolley)
|
||||
cost = 20
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Cargo Train Trolley Crate"
|
||||
group = "Operations"
|
||||
|
||||
/datum/supply_packs/hydroponics // -- Skie
|
||||
name = "Hydroponics Supply Crate"
|
||||
contains = list(/obj/item/weapon/reagent_containers/spray/plantbgone,
|
||||
@@ -829,6 +845,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containername = "Arts and Crafts crate"
|
||||
group = "Operations"
|
||||
|
||||
|
||||
/datum/supply_packs/randomised/contraband
|
||||
num_contained = 6
|
||||
contains = list(/obj/item/weapon/storage/pill_bottle/zoom,
|
||||
@@ -924,7 +941,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containertype = /obj/structure/closet
|
||||
containername = "Formalwear for the best occasions."
|
||||
group = "Operations"
|
||||
|
||||
/*
|
||||
/datum/supply_packs/rust_injector
|
||||
contains = list(/obj/machinery/power/rust_fuel_injector)
|
||||
name = "RUST fuel injector"
|
||||
@@ -960,7 +977,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containername = "RUST tokamak crate"
|
||||
group = "Engineering"
|
||||
access = access_engine
|
||||
|
||||
*/
|
||||
/datum/supply_packs/shield_gen
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_gen)
|
||||
name = "Experimental shield generator circuitry"
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
|
||||
/datum/visibility_network/proc/visibility(var/mob/targetMob)
|
||||
|
||||
|
||||
// if we've got not visibility interface on the mob, we canot do this
|
||||
if (!targetMob.visibility_interface)
|
||||
return
|
||||
@@ -88,12 +88,12 @@
|
||||
|
||||
/datum/visibility_network/proc/getViewpointFromMob(var/mob/currentMob)
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/visibility_network/proc/updateMob(var/mob/currentMob)
|
||||
var/viewpoint = getViewpointFromMob(currentMob)
|
||||
if(viewpoint)
|
||||
updateViewpoint(viewpoint)
|
||||
|
||||
|
||||
|
||||
/datum/visibility_network/proc/updateViewpoint(var/viewpoint)
|
||||
if(validViewpoint(viewpoint))
|
||||
@@ -132,6 +132,9 @@
|
||||
// checks if the network can see a particular atom
|
||||
/datum/visibility_network/proc/checkCanSee(var/atom/target)
|
||||
var/turf/position = get_turf(target)
|
||||
return checkTurfVis(position)
|
||||
|
||||
/datum/visibility_network/proc/checkTurfVis(var/turf/position)
|
||||
var/datum/visibility_chunk/chunk = getChunk(position.x, position.y, position.z)
|
||||
if(chunk)
|
||||
if(chunk.changed)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -64,7 +64,7 @@
|
||||
|
||||
/obj/item/weapon/soap/deluxe
|
||||
icon_state = "soapdeluxe"
|
||||
|
||||
|
||||
/obj/item/weapon/soap/deluxe/New()
|
||||
desc = "A deluxe Waffle Co. brand bar of soap. Smells of [pick("lavender", "vanilla", "strawberry", "chocolate" ,"space")]."
|
||||
|
||||
@@ -548,8 +548,8 @@
|
||||
|
||||
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(A, /obj/effect/spacevine))
|
||||
for(var/obj/effect/spacevine/B in orange(A,1))
|
||||
if(istype(A, /obj/effect/plantsegment))
|
||||
for(var/obj/effect/plantsegment/B in orange(A,1))
|
||||
if(prob(80))
|
||||
del B
|
||||
del A
|
||||
@@ -890,3 +890,8 @@ proc
|
||||
icon_state = "rollball"
|
||||
desc = "A device bored paper pushers use to remind themselves that the time did not stop yet."
|
||||
|
||||
/obj/item/weapon/kidanglobe
|
||||
name = "Kidan homeworld globe"
|
||||
icon = 'icons/obj/decorations.dmi'
|
||||
icon_state = "kidanglobe"
|
||||
desc = "A globe of the Kidan homeworld."
|
||||
@@ -890,6 +890,10 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Captain's Office"
|
||||
icon_state = "captain"
|
||||
|
||||
/area/crew_quarters/recruit
|
||||
name = "\improper Recruitment Office"
|
||||
icon_state = "head_quarters"
|
||||
|
||||
/area/crew_quarters/heads/hop
|
||||
name = "\improper Head of Personnel's Quarters"
|
||||
icon_state = "head_quarters"
|
||||
@@ -1240,6 +1244,9 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Telescience Lab"
|
||||
icon_state = "telesci"
|
||||
|
||||
/area/toxins/telescipad
|
||||
name = "\improper Telescience Lab Pad"
|
||||
icon_state = "telescipad"
|
||||
|
||||
//MedBay
|
||||
|
||||
|
||||
@@ -14,6 +14,19 @@
|
||||
var/moved_recently = 0
|
||||
var/mob/pulledby = null
|
||||
|
||||
var/area/areaMaster
|
||||
|
||||
|
||||
/atom/movable/New()
|
||||
. = ..()
|
||||
areaMaster = get_area_master(src)
|
||||
|
||||
|
||||
// Used in shuttle movement and AI eye stuff.
|
||||
// Primarily used to notify objects being moved by a shuttle/bluespace fuckup.
|
||||
/atom/movable/proc/setLoc(var/T, var/teleported=0)
|
||||
loc = T
|
||||
|
||||
/atom/movable/Move()
|
||||
var/atom/A = src.loc
|
||||
. = ..()
|
||||
|
||||
@@ -295,13 +295,13 @@
|
||||
deactivation_messages = list("You no longer feel uncomfortably hot.")
|
||||
instability=5
|
||||
|
||||
spelltype=/obj/effect/proc_holder/spell/targeted/immolate
|
||||
spelltype=/obj/effect/proc_holder/spell/wizard/targeted/immolate
|
||||
|
||||
New()
|
||||
..()
|
||||
block = IMMOLATEBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/immolate
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/immolate
|
||||
name = "Incendiary Mitochondria"
|
||||
desc = "The subject becomes able to convert excess cellular energy into thermal energy."
|
||||
panel = "Abilities"
|
||||
@@ -319,7 +319,7 @@
|
||||
|
||||
icon_power_button = "genetic_incendiary"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/immolate/cast(list/targets)
|
||||
var/mob/living/L = usr
|
||||
|
||||
L.adjust_fire_stacks(0.5) // Same as walking into fire. Was 100 (goon fire)
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/dna/gene/basic/grant_spell
|
||||
var/obj/effect/proc_holder/spell/spelltype
|
||||
var/obj/effect/proc_holder/spell/wizard/spelltype
|
||||
|
||||
activate(var/mob/M, var/connected, var/flags)
|
||||
M.spell_list += new spelltype(M)
|
||||
@@ -87,7 +87,7 @@
|
||||
return 1
|
||||
|
||||
deactivate(var/mob/M, var/connected, var/flags)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/S in M.spell_list)
|
||||
if(istype(S,spelltype))
|
||||
M.spell_list.Remove(S)
|
||||
..()
|
||||
@@ -113,13 +113,13 @@
|
||||
deactivation_messages = list("Your fingers feel warmer.")
|
||||
instability=10
|
||||
|
||||
spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis
|
||||
spelltype = /obj/effect/proc_holder/spell/wizard/targeted/cryokinesis
|
||||
|
||||
New()
|
||||
..()
|
||||
block = CRYOBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/cryokinesis
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/cryokinesis
|
||||
name = "Cryokinesis"
|
||||
desc = "Drops the bodytemperature of another person."
|
||||
panel = "Abilities"
|
||||
@@ -138,7 +138,7 @@
|
||||
|
||||
icon_power_button = "genetic_cryo"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/cryokinesis/cast(list/targets)
|
||||
if(!targets.len)
|
||||
usr << "<span class='notice'>No target found in range.</span>"
|
||||
return
|
||||
@@ -205,13 +205,13 @@
|
||||
deactivation_messages = list("You don't feel quite so hungry anymore.")
|
||||
instability=3
|
||||
|
||||
spelltype=/obj/effect/proc_holder/spell/targeted/eat
|
||||
spelltype=/obj/effect/proc_holder/spell/wizard/targeted/eat
|
||||
|
||||
New()
|
||||
..()
|
||||
block = EATBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/eat
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/eat
|
||||
name = "Eat"
|
||||
desc = "Eat just about anything!"
|
||||
panel = "Abilities"
|
||||
@@ -229,7 +229,7 @@
|
||||
|
||||
var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/monkey, /mob/living/carbon/human)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/eat/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/eat/choose_targets(mob/user = usr)
|
||||
var/list/targets = list()
|
||||
var/list/possible_targets = list()
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
|
||||
perform(targets)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/eat/proc/doHeal(var/mob/user)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/eat/proc/doHeal(var/mob/user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H=user
|
||||
for(var/name in H.organs_by_name)
|
||||
@@ -259,7 +259,7 @@
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/eat/cast(list/targets)
|
||||
if(!targets.len)
|
||||
usr << "<span class='notice'>No target found in range.</span>"
|
||||
return
|
||||
@@ -327,13 +327,13 @@
|
||||
deactivation_messages = list("Your leg muscles shrink back to normal.")
|
||||
instability=2
|
||||
|
||||
spelltype =/obj/effect/proc_holder/spell/targeted/leap
|
||||
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/leap
|
||||
|
||||
New()
|
||||
..()
|
||||
block = JUMPBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/leap
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/leap
|
||||
name = "Jump"
|
||||
desc = "Leap great distances!"
|
||||
panel = "Abilities"
|
||||
@@ -349,7 +349,7 @@
|
||||
|
||||
icon_power_button = "genetic_jump"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/leap/cast(list/targets)
|
||||
var/failure = 0
|
||||
if (istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat)
|
||||
usr << "\red You can't jump right now!"
|
||||
@@ -422,7 +422,7 @@
|
||||
name = "Polymorphism"
|
||||
desc = "Enables the subject to reconfigure their appearance to mimic that of others."
|
||||
|
||||
spelltype =/obj/effect/proc_holder/spell/targeted/polymorph
|
||||
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/polymorph
|
||||
//cooldown = 1800
|
||||
activation_messages = list("You don't feel entirely like yourself somehow.")
|
||||
deactivation_messages = list("You feel secure in your identity.")
|
||||
@@ -432,7 +432,7 @@
|
||||
..()
|
||||
block = POLYMORPHBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/polymorph
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/polymorph
|
||||
name = "Polymorph"
|
||||
desc = "Mimic the appearance of others!"
|
||||
panel = "Abilities"
|
||||
@@ -446,7 +446,7 @@
|
||||
|
||||
icon_power_button = "genetic_poly"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/polymorph/cast(list/targets)
|
||||
var/mob/living/M=targets[1]
|
||||
if(!ishuman(M))
|
||||
usr << "\red You can only change your appearance to that of another human."
|
||||
@@ -472,7 +472,7 @@
|
||||
name = "Empathic Thought"
|
||||
desc = "The subject becomes able to read the minds of others for certain information."
|
||||
|
||||
spelltype = /obj/effect/proc_holder/spell/targeted/empath
|
||||
spelltype = /obj/effect/proc_holder/spell/wizard/targeted/empath
|
||||
activation_messages = list("You suddenly notice more about others than you did before.")
|
||||
deactivation_messages = list("You no longer feel able to sense intentions.")
|
||||
instability=1
|
||||
@@ -483,7 +483,7 @@
|
||||
..()
|
||||
block = EMPATHBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/empath
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/empath
|
||||
name = "Read Mind"
|
||||
desc = "Read the minds of others for information."
|
||||
charge_max = 1800
|
||||
@@ -495,11 +495,11 @@
|
||||
|
||||
icon_power_button = "genetic_empath"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/empath/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/empath/choose_targets(mob/user = usr)
|
||||
var/list/targets
|
||||
targets += input("Choose the target to spy on.", "Targeting") as mob in range(7,usr)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/empath/cast(list/targets)
|
||||
if(!ishuman(usr)) return
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ Obviously, requires DNA2.
|
||||
deactivation_messages = list("Your muscles quit tensing.")
|
||||
instability=7
|
||||
|
||||
spelltype = /obj/effect/proc_holder/spell/targeted/hulk
|
||||
spelltype = /obj/effect/proc_holder/spell/wizard/targeted/hulk
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -52,7 +52,7 @@ Obviously, requires DNA2.
|
||||
M.Weaken(3)
|
||||
M.emote("collapse")
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/hulk
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/hulk
|
||||
name = "Hulk Out"
|
||||
panel = "Abilities"
|
||||
range = -1
|
||||
@@ -68,11 +68,11 @@ Obviously, requires DNA2.
|
||||
|
||||
icon_power_button = "genetic_hulk"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/hulk/New()
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/hulk/New()
|
||||
desc = "Get mad! For [HULK_DURATION/10] seconds, anyway."
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/hulk/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/hulk/cast(list/targets)
|
||||
if (istype(usr.loc,/mob/))
|
||||
usr << "\red You can't hulk out right now!"
|
||||
return
|
||||
@@ -92,7 +92,7 @@ Obviously, requires DNA2.
|
||||
name = "Morphism"
|
||||
desc = "Enables the subject to reconfigure their appearance to that of any human."
|
||||
|
||||
spelltype =/obj/effect/proc_holder/spell/targeted/morph
|
||||
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/morph
|
||||
//cooldown = 1800
|
||||
activation_messages=list("Your body feels funny.")
|
||||
deactivation_messages = list("You body feels normal.")
|
||||
@@ -105,7 +105,7 @@ Obviously, requires DNA2.
|
||||
..()
|
||||
block = MORPHBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/morph
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/morph
|
||||
name = "Morph"
|
||||
desc = "Mimic the appearance of your choice!"
|
||||
panel = "Abilities"
|
||||
@@ -119,7 +119,7 @@ Obviously, requires DNA2.
|
||||
|
||||
icon_power_button = "genetic_morph"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/morph/cast(list/targets)
|
||||
if(!ishuman(usr)) return
|
||||
|
||||
if (istype(usr.loc,/mob/))
|
||||
@@ -199,13 +199,13 @@ Obviously, requires DNA2.
|
||||
mutation=M_REMOTE_TALK
|
||||
instability=1
|
||||
|
||||
spelltype =/obj/effect/proc_holder/spell/targeted/remotetalk
|
||||
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/remotetalk
|
||||
|
||||
New()
|
||||
..()
|
||||
block=REMOTETALKBLOCK
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remotetalk
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/remotetalk
|
||||
name = "Project Mind"
|
||||
desc = "Make people understand your thoughts at any range!"
|
||||
charge_max = 100
|
||||
@@ -218,11 +218,11 @@ Obviously, requires DNA2.
|
||||
|
||||
icon_power_button = "genetic_project"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remotetalk/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/remotetalk/choose_targets(mob/user = usr)
|
||||
var/list/targets
|
||||
targets += input("Choose the target to talk to.", "Targeting") as mob in living_mob_list
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/remotetalk/cast(list/targets)
|
||||
if(!ishuman(usr)) return
|
||||
|
||||
var/say = input ("What do you wish to say")
|
||||
@@ -244,13 +244,13 @@ Obviously, requires DNA2.
|
||||
mutation=M_REMOTE_VIEW
|
||||
instability=3
|
||||
|
||||
spelltype =/obj/effect/proc_holder/spell/targeted/remoteview
|
||||
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/remoteview
|
||||
|
||||
New()
|
||||
block=REMOTEVIEWBLOCK
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remoteview
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/remoteview
|
||||
name = "Remote View"
|
||||
desc = "Spy on people from any range!"
|
||||
charge_max = 600
|
||||
@@ -263,11 +263,11 @@ Obviously, requires DNA2.
|
||||
|
||||
icon_power_button = "genetic_view"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remoteview/choose_targets(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/remoteview/choose_targets(mob/user = usr)
|
||||
var/list/targets
|
||||
targets += input("Choose the target to spy on.", "Targeting") as mob in living_mob_list
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/remoteview/cast(list/targets)
|
||||
var/mob/living/carbon/human/user
|
||||
if(ishuman(usr))
|
||||
user = usr
|
||||
|
||||
@@ -20,7 +20,7 @@ var/list/blob_nodes = list()
|
||||
var/declared = 0
|
||||
|
||||
var/cores_to_spawn = 1
|
||||
var/players_per_core = 30
|
||||
var/players_per_core = 20
|
||||
var/blob_point_rate = 3
|
||||
|
||||
var/blobwincount = 700
|
||||
|
||||
@@ -1,260 +1,16 @@
|
||||
// SPACE VINES (Note that this code is very similar to Biomass code)
|
||||
/obj/effect/spacevine
|
||||
name = "space vines"
|
||||
desc = "An extremely expansionistic species of vine."
|
||||
icon = 'icons/effects/spacevines.dmi'
|
||||
icon_state = "Light1"
|
||||
anchored = 1
|
||||
density = 0
|
||||
layer = 5
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
var/energy = 0
|
||||
var/obj/effect/spacevine_controller/master = null
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
New()
|
||||
return
|
||||
|
||||
Del()
|
||||
if(master)
|
||||
master.vines -= src
|
||||
master.growth_queue -= src
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (!W || !user || !W.type) return
|
||||
switch(W.type)
|
||||
if(/obj/item/weapon/circular_saw) del src
|
||||
if(/obj/item/weapon/kitchen/utensil/knife) del src
|
||||
if(/obj/item/weapon/scalpel) del src
|
||||
if(/obj/item/weapon/twohanded/fireaxe) del src
|
||||
if(/obj/item/weapon/hatchet) del src
|
||||
if(/obj/item/weapon/melee/energy) del src
|
||||
|
||||
//less effective weapons
|
||||
if(/obj/item/weapon/wirecutters)
|
||||
if(prob(25)) del src
|
||||
if(/obj/item/weapon/shard)
|
||||
if(prob(25)) del src
|
||||
|
||||
else //weapons with subtypes
|
||||
if(istype(W, /obj/item/weapon/melee/energy/sword)) del src
|
||||
else if(istype(W, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0, user)) del src
|
||||
else
|
||||
manual_unbuckle(user)
|
||||
return
|
||||
//Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/spacevine/attack_hand(mob/user as mob)
|
||||
manual_unbuckle(user)
|
||||
|
||||
|
||||
/obj/effect/spacevine/attack_paw(mob/user as mob)
|
||||
manual_unbuckle(user)
|
||||
|
||||
/obj/effect/spacevine/proc/unbuckle()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
|
||||
buckled_mob.buckled = null
|
||||
buckled_mob.anchored = initial(buckled_mob.anchored)
|
||||
buckled_mob.update_canmove()
|
||||
buckled_mob = null
|
||||
return
|
||||
|
||||
/obj/effect/spacevine/proc/manual_unbuckle(mob/user as mob)
|
||||
if(buckled_mob)
|
||||
if(prob(50))
|
||||
if(buckled_mob.buckled == src)
|
||||
if(buckled_mob != user)
|
||||
buckled_mob.visible_message(\
|
||||
"<span class='notice'>[user.name] frees [buckled_mob.name] from the vines.</span>",\
|
||||
"<span class='notice'>[user.name] frees you from the vines.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
else
|
||||
buckled_mob.visible_message(\
|
||||
"<span class='notice'>[buckled_mob.name] struggles free of the vines.</span>",\
|
||||
"<span class='notice'>You untangle the vines from around yourself.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
unbuckle()
|
||||
else
|
||||
var/text = pick("rips","tears","pulls")
|
||||
user.visible_message(\
|
||||
"<span class='notice'>[user.name] [text] at the vines.</span>",\
|
||||
"<span class='notice'>You [text] at the vines.</span>",\
|
||||
"<span class='warning'>You hear shredding and ripping.</span>")
|
||||
return
|
||||
|
||||
/obj/effect/spacevine_controller
|
||||
var/list/obj/effect/spacevine/vines = list()
|
||||
var/list/growth_queue = list()
|
||||
var/reached_collapse_size
|
||||
var/reached_slowdown_size
|
||||
//What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0,
|
||||
//meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
|
||||
|
||||
New()
|
||||
if(!istype(src.loc,/turf/simulated/floor))
|
||||
del(src)
|
||||
|
||||
spawn_spacevine_piece(src.loc)
|
||||
processing_objects.Add(src)
|
||||
|
||||
Del()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
proc/spawn_spacevine_piece(var/turf/location)
|
||||
var/obj/effect/spacevine/SV = new(location)
|
||||
growth_queue += SV
|
||||
vines += SV
|
||||
SV.master = src
|
||||
|
||||
process()
|
||||
if(!vines)
|
||||
del(src) //space vines exterminated. Remove the controller
|
||||
return
|
||||
if(!growth_queue)
|
||||
del(src) //Sanity check
|
||||
return
|
||||
if(vines.len >= 250 && !reached_collapse_size)
|
||||
reached_collapse_size = 1
|
||||
if(vines.len >= 30 && !reached_slowdown_size )
|
||||
reached_slowdown_size = 1
|
||||
|
||||
var/length = 0
|
||||
if(reached_collapse_size)
|
||||
length = 0
|
||||
else if(reached_slowdown_size)
|
||||
if(prob(25))
|
||||
length = 1
|
||||
else
|
||||
length = 0
|
||||
else
|
||||
length = 1
|
||||
length = min( 30 , max( length , vines.len / 5 ) )
|
||||
var/i = 0
|
||||
var/list/obj/effect/spacevine/queue_end = list()
|
||||
|
||||
for( var/obj/effect/spacevine/SV in growth_queue )
|
||||
i++
|
||||
queue_end += SV
|
||||
growth_queue -= SV
|
||||
if(SV.energy < 2) //If tile isn't fully grown
|
||||
if(prob(20))
|
||||
SV.grow()
|
||||
else //If tile is fully grown
|
||||
SV.buckle_mob()
|
||||
|
||||
//if(prob(25))
|
||||
SV.spread()
|
||||
if(i >= length)
|
||||
break
|
||||
|
||||
growth_queue = growth_queue + queue_end
|
||||
//sleep(5)
|
||||
//src.process()
|
||||
|
||||
/obj/effect/spacevine/proc/grow()
|
||||
if(!energy)
|
||||
src.icon_state = pick("Med1", "Med2", "Med3")
|
||||
energy = 1
|
||||
src.opacity = 1
|
||||
layer = 5
|
||||
else
|
||||
src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
|
||||
energy = 2
|
||||
|
||||
/obj/effect/spacevine/proc/buckle_mob()
|
||||
if(!buckled_mob && prob(25))
|
||||
for(var/mob/living/carbon/V in src.loc)
|
||||
if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured
|
||||
V.buckled = src
|
||||
V.loc = src.loc
|
||||
V.update_canmove()
|
||||
src.buckled_mob = V
|
||||
V << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
|
||||
break //only capture one mob at a time.
|
||||
|
||||
/obj/effect/spacevine/proc/spread()
|
||||
var/direction = pick(cardinal)
|
||||
var/step = get_step(src,direction)
|
||||
if(istype(step,/turf/simulated/floor))
|
||||
var/turf/simulated/floor/F = step
|
||||
if(!locate(/obj/effect/spacevine,F))
|
||||
if(F.Enter(src))
|
||||
if(master)
|
||||
master.spawn_spacevine_piece( F )
|
||||
|
||||
/*
|
||||
/obj/effect/spacevine/proc/Life()
|
||||
if (!src) return
|
||||
var/Vspread
|
||||
if (prob(50)) Vspread = locate(src.x + rand(-1,1),src.y,src.z)
|
||||
else Vspread = locate(src.x,src.y + rand(-1, 1),src.z)
|
||||
var/dogrowth = 1
|
||||
if (!istype(Vspread, /turf/simulated/floor)) dogrowth = 0
|
||||
for(var/obj/O in Vspread)
|
||||
if (istype(O, /obj/structure/window) || istype(O, /obj/effect/forcefield) || istype(O, /obj/effect/blob) || istype(O, /obj/effect/alien/weeds) || istype(O, /obj/effect/spacevine)) dogrowth = 0
|
||||
if (istype(O, /obj/machinery/door/))
|
||||
if(O:p_open == 0 && prob(50)) O:open()
|
||||
else dogrowth = 0
|
||||
if (dogrowth == 1)
|
||||
var/obj/effect/spacevine/B = new /obj/effect/spacevine(Vspread)
|
||||
B.icon_state = pick("vine-light1", "vine-light2", "vine-light3")
|
||||
spawn(20)
|
||||
if(B)
|
||||
B.Life()
|
||||
src.growth += 1
|
||||
if (src.growth == 10)
|
||||
src.name = "Thick Space Kudzu"
|
||||
src.icon_state = pick("vine-med1", "vine-med2", "vine-med3")
|
||||
src.opacity = 1
|
||||
src.waittime = 80
|
||||
if (src.growth == 20)
|
||||
src.name = "Dense Space Kudzu"
|
||||
src.icon_state = pick("vine-hvy1", "vine-hvy2", "vine-hvy3")
|
||||
src.density = 1
|
||||
spawn(src.waittime)
|
||||
if (src.growth < 20) src.Life()
|
||||
|
||||
*/
|
||||
|
||||
/obj/effect/spacevine/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(90))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/spacevine/fire_act(null, temp, volume) //hotspots kill vines
|
||||
del src
|
||||
|
||||
//Carn: Spacevines random event.
|
||||
/proc/spacevine_infestation()
|
||||
|
||||
spawn() //to stop the secrets panel hanging
|
||||
var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
for(var/areapath in typesof(/area/hallway))
|
||||
var/area/A = locate(areapath)
|
||||
for(var/area/B in A.related)
|
||||
for(var/turf/simulated/floor/F in B.contents)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
|
||||
if(turfs.len) //Pick a turf to spawn at if we can
|
||||
var/turf/simulated/floor/T = pick(turfs)
|
||||
new/obj/effect/spacevine_controller(T) //spawn a controller at turf
|
||||
message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
|
||||
//Carn: Spacevines random event.
|
||||
/proc/spacevine_infestation()
|
||||
|
||||
spawn() //to stop the secrets panel hanging
|
||||
var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
for(var/areapath in typesof(/area/hallway))
|
||||
var/area/A = locate(areapath)
|
||||
for(var/area/B in A.related)
|
||||
for(var/turf/simulated/floor/F in B.contents)
|
||||
if(!F.contents.len)
|
||||
turfs += F
|
||||
|
||||
if(turfs.len) //Pick a turf to spawn at if we can
|
||||
var/turf/simulated/floor/T = pick(turfs)
|
||||
new/obj/effect/plant_controller(T) //spawn a controller at turf
|
||||
message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
|
||||
|
||||
@@ -60,21 +60,21 @@
|
||||
M << "<B>You are the [H.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals."
|
||||
switch(href_list["school"])
|
||||
if("destruction")
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/projectile/magic_missile(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/dumbfire/fireball(M)
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball."
|
||||
if("bluespace")
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/area_teleport/teleport(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt(M)
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt."
|
||||
if("healing")
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/targeted/charge(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/charge(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/forcewall(M)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand)
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall."
|
||||
if("robeless")
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/knock(M)
|
||||
M.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/mind_transfer(M)
|
||||
M << "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap."
|
||||
M.update_power_buttons()
|
||||
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
*/
|
||||
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation")
|
||||
var/already_knows = 0
|
||||
for(var/obj/effect/proc_holder/spell/aspell in H.spell_list)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/aspell in H.spell_list)
|
||||
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
|
||||
already_knows = 1
|
||||
if(aspell.spell_level >= aspell.level_max)
|
||||
@@ -192,68 +192,68 @@
|
||||
switch(href_list["spell_choice"])
|
||||
if("noclothes")
|
||||
feedback_add_details("wizard_spell_learned","NC")
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/noclothes
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/noclothes
|
||||
temp = "This teaches you how to use your spells without your magical garb, truely you are the wizardest."
|
||||
uses--
|
||||
if("magicmissile")
|
||||
feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/projectile/magic_missile(H)
|
||||
temp = "You have learned magic missile."
|
||||
if("fireball")
|
||||
feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/dumbfire/fireball(H)
|
||||
temp = "You have learned fireball."
|
||||
if("disintegrate")
|
||||
feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/disintegrate(H)
|
||||
temp = "You have learned disintegrate."
|
||||
if("disabletech")
|
||||
feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/emplosion/disable_tech(H)
|
||||
temp = "You have learned disable technology."
|
||||
if("smoke")
|
||||
feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/smoke(H)
|
||||
temp = "You have learned smoke."
|
||||
if("blind")
|
||||
feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/trigger/blind(H)
|
||||
temp = "You have learned blind."
|
||||
if("mindswap")
|
||||
feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/mind_transfer(H)
|
||||
temp = "You have learned mindswap."
|
||||
if("forcewall")
|
||||
feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/forcewall(H)
|
||||
temp = "You have learned forcewall."
|
||||
if("blink")
|
||||
feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/turf_teleport/blink(H)
|
||||
temp = "You have learned blink."
|
||||
if("teleport")
|
||||
feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/area_teleport/teleport(H)
|
||||
temp = "You have learned teleport."
|
||||
if("mutate")
|
||||
feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/genetic/mutate(H)
|
||||
temp = "You have learned mutate."
|
||||
if("etherealjaunt")
|
||||
feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt(H)
|
||||
temp = "You have learned ethereal jaunt."
|
||||
if("knock")
|
||||
feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/knock(H)
|
||||
temp = "You have learned knock."
|
||||
if("horseman")
|
||||
feedback_add_details("wizard_spell_learned","HH") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/horsemask(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/horsemask(H)
|
||||
temp = "You have learned curse of the horseman."
|
||||
if("fleshtostone")
|
||||
feedback_add_details("wizard_spell_learned","FS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/inflict_handler/flesh_to_stone(H)
|
||||
temp = "You have learned flesh to stone."
|
||||
if("summonguns")
|
||||
if(max_uses < 5)
|
||||
@@ -281,7 +281,7 @@
|
||||
if("soulstone")
|
||||
feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H))
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(H)
|
||||
H.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/construct(H)
|
||||
temp = "You have purchased a belt full of soulstones and have learned the artificer spell."
|
||||
max_uses--
|
||||
if("armor")
|
||||
@@ -324,7 +324,7 @@
|
||||
//Single Use Spellbooks//
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse
|
||||
var/spell = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic
|
||||
var/spell = /obj/effect/proc_holder/spell/wizard/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic
|
||||
var/spellname = "sandbox"
|
||||
var/used = 0
|
||||
name = "spellbook of "
|
||||
@@ -337,8 +337,8 @@
|
||||
name += spellname
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/attack_self(mob/user as mob)
|
||||
var/obj/effect/proc_holder/spell/S = new spell
|
||||
for(var/obj/effect/proc_holder/spell/knownspell in user.spell_list)
|
||||
var/obj/effect/proc_holder/spell/wizard/S = new spell
|
||||
for(var/obj/effect/proc_holder/spell/wizard/knownspell in user.spell_list)
|
||||
if(knownspell.type == S.type)
|
||||
if(user.mind)
|
||||
if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard")
|
||||
@@ -366,7 +366,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/fireball
|
||||
spell = /obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
spell = /obj/effect/proc_holder/spell/wizard/dumbfire/fireball
|
||||
spellname = "fireball"
|
||||
icon_state ="bookfireball"
|
||||
desc = "This book feels warm to the touch."
|
||||
@@ -377,7 +377,7 @@
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/smoke
|
||||
spell = /obj/effect/proc_holder/spell/targeted/smoke
|
||||
spell = /obj/effect/proc_holder/spell/wizard/targeted/smoke
|
||||
spellname = "smoke"
|
||||
icon_state ="booksmoke"
|
||||
desc = "This book is overflowing with the dank arts."
|
||||
@@ -391,7 +391,7 @@
|
||||
user.nutrition = 0
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/blind
|
||||
spell = /obj/effect/proc_holder/spell/targeted/trigger/blind
|
||||
spell = /obj/effect/proc_holder/spell/wizard/targeted/trigger/blind
|
||||
spellname = "blind"
|
||||
icon_state ="bookblind"
|
||||
desc = "This book looks blurry, no matter how you look at it."
|
||||
@@ -402,7 +402,7 @@
|
||||
user.eye_blind = 10
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap
|
||||
spell = /obj/effect/proc_holder/spell/targeted/mind_transfer
|
||||
spell = /obj/effect/proc_holder/spell/wizard/targeted/mind_transfer
|
||||
spellname = "mindswap"
|
||||
icon_state ="bookmindswap"
|
||||
desc = "This book's cover is pristine, though its pages look ragged and torn."
|
||||
@@ -419,7 +419,7 @@
|
||||
wabbajack(user)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/forcewall
|
||||
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
spell = /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/forcewall
|
||||
spellname = "forcewall"
|
||||
icon_state ="bookforcewall"
|
||||
desc = "This book has a dedication to mimes everywhere inside the front cover."
|
||||
@@ -433,7 +433,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/knock
|
||||
spell = /obj/effect/proc_holder/spell/aoe_turf/knock
|
||||
spell = /obj/effect/proc_holder/spell/wizard/aoe_turf/knock
|
||||
spellname = "knock"
|
||||
icon_state ="bookknock"
|
||||
desc = "This book is hard to hold closed properly."
|
||||
@@ -445,7 +445,7 @@
|
||||
user.Weaken(20)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/horsemask
|
||||
spell = /obj/effect/proc_holder/spell/targeted/horsemask
|
||||
spell = /obj/effect/proc_holder/spell/wizard/targeted/horsemask
|
||||
spellname = "horses"
|
||||
icon_state ="bookhorses"
|
||||
desc = "This book is more horse than your mind has room for."
|
||||
@@ -464,7 +464,7 @@
|
||||
user <<"<span class='notice'>I say thee neigh</span>"
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/charge
|
||||
spell = /obj/effect/proc_holder/spell/targeted/charge
|
||||
spell = /obj/effect/proc_holder/spell/wizard/targeted/charge
|
||||
spellname = "charging"
|
||||
icon_state ="bookcharge"
|
||||
desc = "This book is made of 100% post-consumer wizard."
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
wizard_mob.verbs += /client/proc/jaunt
|
||||
wizard_mob.mind.special_verbs += /client/proc/jaunt
|
||||
else
|
||||
wizard_mob.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(usr)
|
||||
wizard_mob.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt(usr)
|
||||
*/
|
||||
|
||||
/datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob)
|
||||
@@ -260,7 +260,7 @@
|
||||
if(wizard.current && wizard.current.spell_list)
|
||||
text += "<br><B>[wizard.name] used the following spells: </B>"
|
||||
var/i = 1
|
||||
for(var/obj/effect/proc_holder/spell/S in wizard.current.spell_list)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/S in wizard.current.spell_list)
|
||||
text += "[S.name]"
|
||||
if(wizard.current.spell_list.len > i)
|
||||
text += ", "
|
||||
@@ -274,7 +274,7 @@
|
||||
|
||||
//To batch-remove wizard spells. Linked to mind.dm.
|
||||
/mob/proc/spellremove(var/mob/M as mob)
|
||||
for(var/obj/effect/proc_holder/spell/spell_to_remove in src.spell_list)
|
||||
for(var/obj/effect/proc_holder/spell/wizard/spell_to_remove in src.spell_list)
|
||||
del(spell_to_remove)
|
||||
update_power_buttons()
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction, access_sec_doors,
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_mechanic)
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 21
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -51,7 +51,7 @@
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
||||
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
|
||||
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
|
||||
|
||||
minimal_player_age = 7
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -85,6 +85,7 @@
|
||||
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
|
||||
minimal_access = list(access_eva, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
|
||||
alt_titles = list("Atmospheric Technician")
|
||||
minimal_player_age = 7
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
minimal_access = list(access_eva, access_medical, access_morgue, access_genetics, access_heads,
|
||||
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
||||
access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels)
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 21
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -48,6 +48,7 @@
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_morgue, access_surgery, access_maint_tunnels)
|
||||
alt_titles = list("Surgeon","Nurse"/*,"Virologist","Medical Intern","Orderly","First Responder"*/)
|
||||
minimal_player_age = 3
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -104,6 +105,7 @@
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_chemistry, access_maint_tunnels)
|
||||
alt_titles = list("Pharmacist","Pharmacologist")
|
||||
minimal_player_age = 7
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
@@ -133,7 +135,7 @@
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
|
||||
minimal_access = list(access_medical, access_morgue, access_genetics, access_research, access_maint_tunnels)
|
||||
|
||||
minimal_player_age = 3
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -162,7 +164,7 @@
|
||||
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
minimal_access = list(access_medical, access_virology, access_maint_tunnels)
|
||||
alt_titles = list("Pathologist","Microbiologist")
|
||||
|
||||
minimal_player_age = 7
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -224,6 +226,8 @@
|
||||
selection_color = "#ffeef0"
|
||||
access = list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks)
|
||||
minimal_access=list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks)
|
||||
minimal_player_age = 3
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_maint_tunnels)
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 21
|
||||
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
required_objectives=list(
|
||||
@@ -52,6 +52,7 @@
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch, access_maint_tunnels)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher")
|
||||
minimal_player_age = 3
|
||||
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
required_objectives=list(
|
||||
@@ -85,6 +86,7 @@
|
||||
selection_color = "#ffeeff"
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
minimal_access = list(access_research, access_xenobiology, access_maint_tunnels)
|
||||
minimal_player_age = 7
|
||||
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
required_objectives=list(
|
||||
@@ -119,6 +121,7 @@
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_maint_tunnels) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
|
||||
minimal_player_age = 3
|
||||
|
||||
required_objectives=list(
|
||||
/datum/job_objective/make_cyborg,
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_customs,access_weapons)
|
||||
minimal_player_age = 14
|
||||
minimal_player_age = 21
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -58,7 +58,7 @@
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_weapons)
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 21
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -97,7 +97,7 @@
|
||||
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
|
||||
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court, access_weapons)
|
||||
alt_titles = list("Forensic Technician")
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 14
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
|
||||
@@ -149,7 +149,7 @@
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons)
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 14
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
|
||||
@@ -238,8 +238,8 @@
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons)
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_weapons, access_pilot)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_weapons, access_pilot)
|
||||
minimal_player_age = 7
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
req_admin_notify = 1
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
minimal_player_age = 14
|
||||
minimal_player_age = 30
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
|
||||
@@ -54,7 +54,7 @@
|
||||
selection_color = "#ddddff"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
minimal_player_age = 21
|
||||
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_wear_pda)
|
||||
switch(H.backbag)
|
||||
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
var/bees_in_hive = 0
|
||||
var/list/owned_bee_swarms = list()
|
||||
var/hydrotray_type = /obj/machinery/hydroponics
|
||||
var/hydrotray_type = /obj/machinery/portable_atmospherics/hydroponics
|
||||
|
||||
//overwrite this after it's created if the apiary needs a custom machinery sprite
|
||||
/obj/machinery/apiary/New()
|
||||
@@ -169,14 +169,14 @@
|
||||
bees_in_hive -= 1
|
||||
|
||||
//find some plants, harvest
|
||||
for(var/obj/machinery/hydroponics/H in view(7, src))
|
||||
if(H.planted && !H.dead && H.myseed && prob(owned_bee_swarms.len * 10))
|
||||
for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src))
|
||||
if(H.seed && !H.dead && prob(owned_bee_swarms.len * 10))
|
||||
src.nutrilevel++
|
||||
H.nutrilevel++
|
||||
if(mut < H.mutmod - 1)
|
||||
mut = H.mutmod - 1
|
||||
else if(mut > H.mutmod - 1)
|
||||
H.mutmod = mut
|
||||
if(mut < H.mutation_mod - 1)
|
||||
mut = H.mutation_mod - 1
|
||||
else if(mut > H.mutation_mod - 1)
|
||||
H.mutation_mod = mut
|
||||
|
||||
//flowers give us pollen (nutrients)
|
||||
/* - All plants should be giving nutrients to the hive.
|
||||
@@ -188,11 +188,11 @@
|
||||
if(prob(10))
|
||||
H.lastcycle -= 5
|
||||
if(prob(10))
|
||||
H.myseed.lifespan = max(initial(H.myseed.lifespan) * 1.5, H.myseed.lifespan + 1)
|
||||
H.seed.lifespan = max(initial(H.seed.lifespan) * 1.5, H.seed.lifespan + 1)
|
||||
if(prob(10))
|
||||
H.myseed.endurance = max(initial(H.myseed.endurance) * 1.5, H.myseed.endurance + 1)
|
||||
if(H.toxic && prob(10))
|
||||
H.toxic = min(0, H.toxic - 1)
|
||||
H.seed.endurance = max(initial(H.seed.endurance) * 1.5, H.seed.endurance + 1)
|
||||
if(H.toxins && prob(10))
|
||||
H.toxins = min(0, H.toxins - 1)
|
||||
toxic++
|
||||
|
||||
/obj/machinery/apiary/proc/die()
|
||||
|
||||
@@ -241,4 +241,4 @@
|
||||
else
|
||||
if (sorttext(a.c_tag, b.c_tag) < 0)
|
||||
L.Swap(j, j + 1)
|
||||
return L
|
||||
return L
|
||||
|
||||
@@ -86,19 +86,19 @@
|
||||
crewmemberData["tox"] = round(H.getToxLoss(), 1)
|
||||
crewmemberData["fire"] = round(H.getFireLoss(), 1)
|
||||
crewmemberData["brute"] = round(H.getBruteLoss(), 1)
|
||||
|
||||
|
||||
crewmemberData["name"] = "Unknown"
|
||||
crewmemberData["rank"] = "Unknown"
|
||||
crewmemberData["rank"] = "Unknown"
|
||||
if(H.wear_id && istype(H.wear_id, /obj/item/weapon/card/id) )
|
||||
var/obj/item/weapon/card/id/I = H.wear_id
|
||||
crewmemberData["name"] = I.name
|
||||
crewmemberData["name"] = I.name
|
||||
crewmemberData["rank"] = I.rank
|
||||
else if(H.wear_id && istype(H.wear_id, /obj/item/device/pda) )
|
||||
var/obj/item/device/pda/P = H.wear_id
|
||||
crewmemberData["name"] = (P.id ? P.id.name : "Unknown")
|
||||
var/obj/item/device/pda/P = H.wear_id
|
||||
crewmemberData["name"] = (P.id ? P.id.name : "Unknown")
|
||||
crewmemberData["rank"] = (P.id ? P.id.rank : "Unknown")
|
||||
|
||||
crewmemberData["area"] = get_area(H)
|
||||
var/area/A = get_area(H)
|
||||
crewmemberData["area"] = sanitize(A.name)
|
||||
crewmemberData["x"] = pos.x
|
||||
crewmemberData["y"] = pos.y
|
||||
|
||||
@@ -113,15 +113,15 @@
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800)
|
||||
|
||||
|
||||
// adding a template with the key "mapContent" enables the map ui functionality
|
||||
ui.add_template("mapContent", "crew_monitor_map_content.tmpl")
|
||||
// adding a template with the key "mapHeader" replaces the map header content
|
||||
ui.add_template("mapHeader", "crew_monitor_map_header.tmpl")
|
||||
|
||||
|
||||
// we want to show the map by default
|
||||
ui.set_show_map(1)
|
||||
|
||||
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
|
||||
@@ -135,4 +135,4 @@
|
||||
var/obj/item/clothing/under/C = H.w_uniform
|
||||
if (C.has_sensor)
|
||||
tracked |= C
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -494,8 +494,8 @@ About the new airlock wires panel:
|
||||
/obj/machinery/door/airlock/proc/canAIControl()
|
||||
return ((src.aiControlDisabled!=1) && (!src.isAllPowerCut()));
|
||||
|
||||
/obj/machinery/door/airlock/proc/canAIHack()
|
||||
return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerCut()));
|
||||
/obj/machinery/door/airlock/proc/canAIHack(var/user as mob)
|
||||
return (isAI(user) && src.aiControlDisabled==1 && !hackProof && !src.isAllPowerCut());
|
||||
|
||||
/obj/machinery/door/airlock/proc/arePowerSystemsOn()
|
||||
return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0)
|
||||
@@ -613,12 +613,8 @@ About the new airlock wires panel:
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/attack_ai(mob/user as mob)
|
||||
if(!src.canAIControl())
|
||||
if(src.canAIHack())
|
||||
src.hack(user)
|
||||
return
|
||||
else
|
||||
user << "Airlock AI control has been blocked with a firewall. Unable to hack."
|
||||
if (!check_synth_access(user))
|
||||
return
|
||||
|
||||
//Separate interface for the AI.
|
||||
user.set_machine(src)
|
||||
@@ -738,7 +734,7 @@ About the new airlock wires panel:
|
||||
user << "Alert cancelled. Airlock control has been restored without our assistance."
|
||||
src.aiHacking=0
|
||||
return
|
||||
else if(!src.canAIHack())
|
||||
else if(!src.canAIHack(user))
|
||||
user << "We've lost our connection! Unable to hack airlock."
|
||||
src.aiHacking=0
|
||||
return
|
||||
@@ -750,7 +746,7 @@ About the new airlock wires panel:
|
||||
user << "Alert cancelled. Airlock control has been restored without our assistance."
|
||||
src.aiHacking=0
|
||||
return
|
||||
else if(!src.canAIHack())
|
||||
else if(!src.canAIHack(user))
|
||||
user << "We've lost our connection! Unable to hack airlock."
|
||||
src.aiHacking=0
|
||||
return
|
||||
@@ -760,7 +756,7 @@ About the new airlock wires panel:
|
||||
user << "Alert cancelled. Airlock control has been restored without our assistance."
|
||||
src.aiHacking=0
|
||||
return
|
||||
else if(!src.canAIHack())
|
||||
else if(!src.canAIHack(user))
|
||||
user << "We've lost our connection! Unable to hack airlock."
|
||||
src.aiHacking=0
|
||||
return
|
||||
@@ -814,6 +810,17 @@ About the new airlock wires panel:
|
||||
..(user)
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/proc/check_synth_access(mob/user as mob)
|
||||
if(emagged)
|
||||
user << "<span class='warning'>Unable to interface: Airlock is unresponsive.</span>"
|
||||
return 0
|
||||
if(!src.canAIControl())
|
||||
if(src.canAIHack(user))
|
||||
src.hack(user)
|
||||
else
|
||||
user << "<span class='warning'>Airlock AI control has been blocked with a firewall.</span>"
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0)
|
||||
// If you add an if(..()) check you must first remove the var/nowindow parameter.
|
||||
@@ -874,7 +881,10 @@ About the new airlock wires panel:
|
||||
|
||||
|
||||
|
||||
if(istype(usr, /mob/living/silicon) && src.canAIControl())
|
||||
if(istype(usr, /mob/living/silicon))
|
||||
if (!check_synth_access(usr))
|
||||
return
|
||||
|
||||
//AI
|
||||
//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door, 8 door safties, 9 door speed
|
||||
//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door, 8 door safties, 9 door speed
|
||||
@@ -884,10 +894,11 @@ About the new airlock wires panel:
|
||||
if(1)
|
||||
//disable idscan
|
||||
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
|
||||
usr << "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways."
|
||||
usr << "The IdScan wire has been cut - The IdScan feature is already disabled."
|
||||
else if(src.aiDisabledIdScanner)
|
||||
usr << "You've already disabled the IdScan feature."
|
||||
usr << "The IdScan feature is already disabled."
|
||||
else
|
||||
usr << "The IdScan feature has been disabled."
|
||||
src.aiDisabledIdScanner = 1
|
||||
if(2)
|
||||
//disrupt main power
|
||||
@@ -904,39 +915,19 @@ About the new airlock wires panel:
|
||||
if(4)
|
||||
//drop door bolts
|
||||
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
|
||||
usr << "You can't drop the door bolts - The door bolt dropping wire has been cut."
|
||||
else if(src.locked!=1)
|
||||
src.locked = 1
|
||||
update_icon()
|
||||
usr << "The door bolt control wire has been cut - The door bolts are already dropped."
|
||||
else if(src.locked)
|
||||
usr << "The door bolts are already dropped."
|
||||
else
|
||||
src.lock()
|
||||
usr << "The door bolts have been dropped."
|
||||
if(5)
|
||||
//un-electrify door
|
||||
if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
|
||||
usr << text("Can't un-electrify the airlock - The electrification wire is cut.")
|
||||
else if(src.secondsElectrified==-1)
|
||||
usr << text("The electrification wire is cut - Cannot un-electrify the door.")
|
||||
else if(secondsElectrified != 0)
|
||||
usr << "The door is now un-electrified."
|
||||
src.secondsElectrified = 0
|
||||
else if(src.secondsElectrified>0)
|
||||
src.secondsElectrified = 0
|
||||
|
||||
if(8)
|
||||
// Safeties! We don't need no stinking safeties!
|
||||
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
|
||||
usr << text("Control to door sensors is disabled.")
|
||||
else if (src.safe)
|
||||
safe = 0
|
||||
else
|
||||
usr << text("Firmware reports safeties already overriden.")
|
||||
|
||||
|
||||
|
||||
if(9)
|
||||
// Door speed control
|
||||
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
|
||||
usr << text("Control to door timing circuitry has been severed.")
|
||||
else if (src.normalspeed)
|
||||
normalspeed = 0
|
||||
else
|
||||
usr << text("Door timing circurity already accellerated.")
|
||||
|
||||
if(7)
|
||||
//close door
|
||||
if(src.welded)
|
||||
@@ -947,17 +938,31 @@ About the new airlock wires panel:
|
||||
close()
|
||||
else
|
||||
open()
|
||||
|
||||
if(8)
|
||||
// Safeties! We don't need no stinking safeties!
|
||||
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
|
||||
usr << text("Control to door sensors is disabled.")
|
||||
else if (src.safe)
|
||||
safe = 0
|
||||
else
|
||||
usr << text("Firmware reports safeties already overridden.")
|
||||
if(9)
|
||||
// Door speed control
|
||||
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
|
||||
usr << text("Control to door timing circuitry has been severed.")
|
||||
else if (src.normalspeed)
|
||||
normalspeed = 0
|
||||
else
|
||||
usr << text("Door timing circuity already accelerated.")
|
||||
if(10)
|
||||
// Bolt lights
|
||||
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
|
||||
usr << text("Control to door bolt lights has been severed.</a>")
|
||||
usr << "The bolt lights wire has been cut - The door bolt lights are already disabled."
|
||||
else if (src.lights)
|
||||
lights = 0
|
||||
usr << "The door bolt lights have been disabled."
|
||||
else
|
||||
usr << text("Door bolt lights are already disabled!")
|
||||
|
||||
|
||||
usr << "The door bolt lights are already disabled!"
|
||||
|
||||
else if(href_list["aiEnable"])
|
||||
var/code = text2num(href_list["aiEnable"])
|
||||
@@ -965,20 +970,23 @@ About the new airlock wires panel:
|
||||
if(1)
|
||||
//enable idscan
|
||||
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
|
||||
usr << "You can't enable IdScan - The IdScan wire has been cut."
|
||||
usr << "The IdScan wire has been cut - The IdScan feature cannot be enabled."
|
||||
else if(src.aiDisabledIdScanner)
|
||||
usr << "The IdScan feature has been enabled."
|
||||
src.aiDisabledIdScanner = 0
|
||||
else
|
||||
usr << "The IdScan feature is not disabled."
|
||||
usr << "The IdScan feature is already enabled."
|
||||
if(4)
|
||||
//raise door bolts
|
||||
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
|
||||
usr << text("The door bolt control wire is cut - you can't raise the door bolts.<br>\n")
|
||||
usr << "The door bolt control wire has been cut - The door bolts cannot be raised."
|
||||
else if(!src.locked)
|
||||
usr << text("The door bolts are already up.<br>\n")
|
||||
usr << "The door bolts are already raised."
|
||||
else
|
||||
src.unlock()
|
||||
|
||||
if(src.unlock())
|
||||
usr << "The door bolts have been raised."
|
||||
else
|
||||
usr << "Unable to raise door bolts."
|
||||
if(5)
|
||||
//electrify door for 30 seconds
|
||||
if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY))
|
||||
@@ -986,17 +994,17 @@ About the new airlock wires panel:
|
||||
else if(src.secondsElectrified==-1)
|
||||
usr << text("The door is already indefinitely electrified. You'd have to un-electrify it before you can re-electrify it with a non-forever duration.<br>\n")
|
||||
else if(src.secondsElectrified!=0)
|
||||
usr << text("The door is already electrified. You can't re-electrify it while it's already electrified.<br>\n")
|
||||
usr << text("The door is already electrified. Cannot re-electrify it while it's already electrified.<br>\n")
|
||||
else
|
||||
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
|
||||
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
usr << "The door is now electrified for thirty seconds."
|
||||
src.secondsElectrified = 30
|
||||
spawn(10)
|
||||
while (src.secondsElectrified>0)
|
||||
src.secondsElectrified-=1
|
||||
if(src.secondsElectrified<0)
|
||||
src.secondsElectrified = 0
|
||||
src.updateUsrDialog()
|
||||
sleep(10)
|
||||
if(6)
|
||||
//electrify door indefinitely
|
||||
@@ -1009,28 +1017,8 @@ About the new airlock wires panel:
|
||||
else
|
||||
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
|
||||
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
usr << "The door is now electrified."
|
||||
src.secondsElectrified = -1
|
||||
|
||||
if (8) // Not in order >.>
|
||||
// Safeties! Maybe we do need some stinking safeties!
|
||||
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
|
||||
usr << text("Control to door sensors is disabled.")
|
||||
else if (!src.safe)
|
||||
safe = 1
|
||||
src.updateUsrDialog()
|
||||
else
|
||||
usr << text("Firmware reports safeties already in place.")
|
||||
|
||||
if(9)
|
||||
// Door speed control
|
||||
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
|
||||
usr << text("Control to door timing circuitry has been severed.")
|
||||
else if (!src.normalspeed)
|
||||
normalspeed = 1
|
||||
src.updateUsrDialog()
|
||||
else
|
||||
usr << text("Door timing circurity currently operating normally.")
|
||||
|
||||
if(7)
|
||||
//open door
|
||||
if(src.welded)
|
||||
@@ -1041,16 +1029,31 @@ About the new airlock wires panel:
|
||||
open()
|
||||
else
|
||||
close()
|
||||
|
||||
if (8)
|
||||
// Safeties! Maybe we do need some stinking safeties!
|
||||
if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
|
||||
usr << text("Control to door sensors is disabled.")
|
||||
else if (!src.safe)
|
||||
safe = 1
|
||||
else
|
||||
usr << text("Firmware reports safeties already in place.")
|
||||
if(9)
|
||||
// Door speed control
|
||||
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
|
||||
usr << text("Control to door timing circuitry has been severed.")
|
||||
else if (!src.normalspeed)
|
||||
normalspeed = 1
|
||||
else
|
||||
usr << text("Door timing circuity currently operating normally.")
|
||||
if(10)
|
||||
// Bolt lights
|
||||
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
|
||||
usr << text("Control to door bolt lights has been severed.</a>")
|
||||
usr << "The bolt lights wire has been cut - The door bolt lights cannot be enabled."
|
||||
else if (!src.lights)
|
||||
lights = 1
|
||||
src.updateUsrDialog()
|
||||
usr << "The door bolt lights have been enabled"
|
||||
else
|
||||
usr << text("Door bolt lights are already enabled!")
|
||||
usr << "The door bolt lights are already enabled!"
|
||||
|
||||
add_fingerprint(usr)
|
||||
update_icon()
|
||||
@@ -1256,13 +1259,15 @@ About the new airlock wires panel:
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/door/airlock/proc/unlock(var/forced=0)
|
||||
if (!src.locked) return
|
||||
if (!src.locked) return 0
|
||||
|
||||
if(forced || src.arePowerSystemsOn()) //only can raise bolts if power's on
|
||||
src.locked = 0
|
||||
for(var/mob/M in range(1,src))
|
||||
M.show_message("You hear a click from the bottom of the door.", 2)
|
||||
update_icon()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/door/airlock/New()
|
||||
..()
|
||||
|
||||
@@ -1,41 +1,13 @@
|
||||
/var/const/OPEN = 1
|
||||
/var/const/CLOSED = 2
|
||||
|
||||
#define NORTHCOLD 1
|
||||
#define NORTHHOT 2
|
||||
#define SOUTHCOLD 4
|
||||
#define SOUTHHOT 8
|
||||
#define WESTCOLD 32
|
||||
#define WESTHOT 64
|
||||
#define EASTCOLD 128
|
||||
#define EASTHOT 256
|
||||
/* HAHA TOPY PASTAN
|
||||
/proc/getTemperatureDifferential(var/turf/loc)
|
||||
var/mint=16777216;
|
||||
var/maxt= 0;
|
||||
for(var/dir in cardinal)
|
||||
var/turf/simulated/T=get_turf(get_step(loc,dir))
|
||||
var/ct=0
|
||||
if(T && istype(T) && T.zone)
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
ct = environment.temperature
|
||||
else
|
||||
if(istype(T,/turf/simulated))
|
||||
continue
|
||||
if(ct<mint)mint=ct
|
||||
if(ct>maxt)maxt=ct
|
||||
if(mint <= T20C - 20)
|
||||
return convert_temperature(mint)-convert_temperature(maxt)
|
||||
else
|
||||
return convert_temperature(maxt)-convert_temperature(mint)
|
||||
*/
|
||||
/proc/convert_k2c(var/temp)
|
||||
return ((temp - T0C)) // * 1.8) + 32
|
||||
|
||||
/proc/convert_c2k(var/temp)
|
||||
return ((temp + T0C)) // * 1.8) + 32
|
||||
|
||||
/proc/getCardinalTemperatures(var/turf/loc)
|
||||
/proc/getCardinalAirInfo(var/turf/loc, var/list/stats=list("temperature"))
|
||||
var/list/temps = new/list(4)
|
||||
for(var/dir in cardinal)
|
||||
var/direction
|
||||
@@ -49,17 +21,29 @@
|
||||
if(WEST)
|
||||
direction = 4
|
||||
var/turf/simulated/T=get_turf(get_step(loc,dir))
|
||||
var/list/rstats = new /list(stats.len)
|
||||
if(T && istype(T) && T.zone)
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
temps[direction] = environment.temperature
|
||||
else
|
||||
if(istype(T, /turf/simulated))
|
||||
temps[direction] = T20C
|
||||
else
|
||||
temps[direction] = 0
|
||||
for(var/i=1;i<=stats.len;i++)
|
||||
rstats[i] = environment.vars[stats[i]]
|
||||
else if(istype(T, /turf/simulated))
|
||||
rstats = null // Exclude zone (wall, door, etc).
|
||||
else if(istype(T, /turf))
|
||||
// Should still work. (/turf/return_air())
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
for(var/i=1;i<=stats.len;i++)
|
||||
rstats[i] = environment.vars[stats[i]]
|
||||
temps[direction] = rstats
|
||||
return temps
|
||||
|
||||
#define FIREDOOR_MAX_PRESSURE_DIFF 25 // kPa
|
||||
#define FIREDOOR_MAX_TEMP 50 // °C
|
||||
#define FIREDOOR_MIN_TEMP 0
|
||||
|
||||
// Bitflags
|
||||
#define FIREDOOR_ALERT_HOT 1
|
||||
#define FIREDOOR_ALERT_COLD 2
|
||||
// Not used #define FIREDOOR_ALERT_LOWPRESS 4
|
||||
|
||||
/obj/machinery/door/firedoor
|
||||
name = "\improper Emergency Shutter"
|
||||
@@ -71,13 +55,21 @@
|
||||
density = 0
|
||||
|
||||
var/blocked = 0
|
||||
var/lockdown = 0 // When the door has detected a problem, it locks.
|
||||
var/pdiff_alert = 0
|
||||
var/pdiff = 0
|
||||
var/tdiff_alert = 0
|
||||
var/nextstate = null
|
||||
var/net_id
|
||||
var/list/areas_added
|
||||
var/list/users_to_open
|
||||
var/list/tile_info[4]
|
||||
var/list/dir_alerts[4] // 4 dirs, bitflags
|
||||
|
||||
// MUST be in same order as FIREDOOR_ALERT_*
|
||||
var/list/ALERT_STATES=list(
|
||||
"hot",
|
||||
"cold"
|
||||
)
|
||||
|
||||
/obj/machinery/door/firedoor/New()
|
||||
. = ..()
|
||||
@@ -109,39 +101,35 @@
|
||||
set src in view()
|
||||
. = ..()
|
||||
if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF)
|
||||
usr << "<span class='warning'>WARNING: Current pressure differential is [pdiff]kPa!</span>"
|
||||
if(tdiff_alert)
|
||||
var/alerts
|
||||
var/list/temperatures = getCardinalTemperatures(src.loc)
|
||||
for(var/index = 1; index <= temperatures.len; index++)
|
||||
var/celsius = convert_k2c(temperatures[index])
|
||||
switch(index)
|
||||
if(1)
|
||||
alerts += "NORTH: "
|
||||
if(celsius >= 50 || celsius <= 0)
|
||||
alerts += "[celsius]"
|
||||
else
|
||||
alerts += "NORMAL"
|
||||
if(2)
|
||||
alerts += " SOUTH: "
|
||||
if(celsius >= 50 || celsius <= 0)
|
||||
alerts += "[celsius]"
|
||||
else
|
||||
alerts += "NORMAL"
|
||||
if(3)
|
||||
alerts += " EAST: "
|
||||
if(celsius >= 50 || celsius <= 0)
|
||||
alerts += "[celsius]"
|
||||
else
|
||||
alerts += "NORMAL"
|
||||
if(4)
|
||||
alerts += " WEST: "
|
||||
if(celsius >= 50 || celsius <= 0)
|
||||
alerts += "[celsius]"
|
||||
else
|
||||
alerts += "NORMAL"
|
||||
usr << "<span class='warning'>WARNING: Current pressure differential is [pdiff]kPa! Opening door may result in injury!</span>"
|
||||
|
||||
usr << "<b>Sensor readings:</b>"
|
||||
for(var/index = 1; index <= tile_info.len; index++)
|
||||
var/o = " "
|
||||
switch(index)
|
||||
if(1)
|
||||
o += "NORTH: "
|
||||
if(2)
|
||||
o += "SOUTH: "
|
||||
if(3)
|
||||
o += "EAST: "
|
||||
if(4)
|
||||
o += "WEST: "
|
||||
if(tile_info[index] == null)
|
||||
o += "<span class='warning'>DATA UNAVAILABLE</span>"
|
||||
usr << o
|
||||
continue
|
||||
var/celsius = convert_k2c(tile_info[index][1])
|
||||
var/pressure = tile_info[index][2]
|
||||
if(dir_alerts[index] & (FIREDOOR_ALERT_HOT|FIREDOOR_ALERT_COLD))
|
||||
o += "<span class='warning'>"
|
||||
else
|
||||
o += "<span style='color:blue'>"
|
||||
o += "[celsius]?C</span> "
|
||||
o += "<span style='color:blue'>"
|
||||
o += "[pressure]kPa</span></li>"
|
||||
usr << o
|
||||
|
||||
usr << "<span class='warning'>WARNING: Current temperatures are, [alerts] </span>"
|
||||
if( islist(users_to_open) && users_to_open.len)
|
||||
var/users_to_open_string = users_to_open[1]
|
||||
if(users_to_open.len >= 2)
|
||||
@@ -149,7 +137,6 @@
|
||||
users_to_open_string += ", [users_to_open[i]]"
|
||||
usr << "These people have opened \the [src] during an alert: [users_to_open_string]."
|
||||
|
||||
|
||||
/obj/machinery/door/firedoor/Bumped(atom/AM)
|
||||
if(p_open || operating)
|
||||
return
|
||||
@@ -174,47 +161,7 @@
|
||||
|
||||
|
||||
/obj/machinery/door/firedoor/attack_hand(mob/user as mob)
|
||||
add_fingerprint(user)
|
||||
if(operating)
|
||||
return//Already doing something.
|
||||
|
||||
if(blocked)
|
||||
user << "<span class='warning'>\The [src] is welded solid!</span>"
|
||||
return
|
||||
|
||||
if(!allowed(user))
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return
|
||||
|
||||
var/area/A = get_area(src)
|
||||
ASSERT(istype(A))
|
||||
if(A.master)
|
||||
A = A.master
|
||||
var/alarmed = A.air_doors_activated || A.fire
|
||||
|
||||
var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\
|
||||
"\The [src]", "Yes, [density ? "open" : "close"]", "No")
|
||||
if(answer == "No")
|
||||
return
|
||||
if(user.stat || !user.canmove || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1)
|
||||
user << "Sorry, you must remain able bodied and close to \the [src] in order to use it."
|
||||
return
|
||||
|
||||
var/needs_to_close = 0
|
||||
if(density)
|
||||
if(alarmed)
|
||||
needs_to_close = 1
|
||||
spawn()
|
||||
open()
|
||||
else
|
||||
spawn()
|
||||
close()
|
||||
|
||||
if(needs_to_close)
|
||||
spawn(50)
|
||||
if(alarmed)
|
||||
nextstate = CLOSED
|
||||
|
||||
return attackby(null, user)
|
||||
|
||||
/obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob)
|
||||
add_fingerprint(user)
|
||||
@@ -235,48 +182,102 @@
|
||||
return
|
||||
|
||||
var/area/A = get_area_master(src)
|
||||
ASSERT(istype(A))
|
||||
if(A.master)
|
||||
A = A.master
|
||||
ASSERT(istype(A)) // This worries me.
|
||||
var/alarmed = A.air_doors_activated || A.fire
|
||||
|
||||
if( istype(C, /obj/item/weapon/crowbar) || ( istype(C,/obj/item/weapon/twohanded/fireaxe) && C:wielded == 1 ) )
|
||||
if(operating)
|
||||
return
|
||||
|
||||
if( blocked && istype(C, /obj/item/weapon/crowbar) )
|
||||
if( blocked )
|
||||
user.visible_message("\red \The [user] pries at \the [src] with \a [C], but \the [src] is welded in place!",\
|
||||
"You try to pry \the [src] [density ? "open" : "closed"], but it is welded in place!",\
|
||||
"You hear someone struggle and metal straining.")
|
||||
return
|
||||
|
||||
user.visible_message("\red \The [user] starts to force \the [src] [density ? "open" : "closed"] with \a [C]!",\
|
||||
"You start forcing \the [src] [density ? "open" : "closed"] with \the [C]!",\
|
||||
"You hear metal strain.")
|
||||
if(do_after(user,30))
|
||||
if( istype(C, /obj/item/weapon/crowbar) )
|
||||
if( stat & (BROKEN|NOPOWER) || !density)
|
||||
user.visible_message("\red \The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!",\
|
||||
"You force \the [src] [density ? "open" : "closed"] with \the [C]!",\
|
||||
"You hear metal strain, and a door [density ? "open" : "close"].")
|
||||
else
|
||||
user.visible_message("\red \The [user] forces \the [ blocked ? "welded" : "" ] [src] [density ? "open" : "closed"] with \a [C]!",\
|
||||
"You force \the [ blocked ? "welded" : "" ] [src] [density ? "open" : "closed"] with \the [C]!",\
|
||||
"You hear metal strain and groan, and a door [density ? "open" : "close"].")
|
||||
var/needs_to_close = 0
|
||||
if(density)
|
||||
if(alarmed)
|
||||
needs_to_close = 1
|
||||
spawn(0)
|
||||
open()
|
||||
else
|
||||
spawn(0)
|
||||
close()
|
||||
if(needs_to_close)
|
||||
spawn(50)
|
||||
if(alarmed)
|
||||
nextstate = CLOSED
|
||||
if( stat & (BROKEN|NOPOWER) || !density || !alarmed )
|
||||
user.visible_message("\red \The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!",\
|
||||
"You force \the [src] [density ? "open" : "closed"] with \the [C]!",\
|
||||
"You hear metal strain, and a door [density ? "open" : "close"].")
|
||||
else if( allowed(user) )
|
||||
user.visible_message("\blue \The [user] lifts \the [src] with \a [C].",\
|
||||
"\The [src] scans your ID, and obediently opens as you apply your [C].",\
|
||||
"You hear metal move, and a door [density ? "open" : "close"].")
|
||||
else if(lockdown)
|
||||
user.visible_message("\blue \The [user] pries at \the [src] with \a [C], but \the [src] resists being opened.",\
|
||||
"\red You pry at \the [src], but it actively resists your efforts. Maybe use your ID, perhaps?",\
|
||||
"You hear someone struggling and metal straining")
|
||||
return
|
||||
if(density)
|
||||
spawn(0)
|
||||
open()
|
||||
else
|
||||
spawn(0)
|
||||
close()
|
||||
return
|
||||
var/access_granted = 0
|
||||
var/users_name
|
||||
if(!istype(C, /obj)) //If someone hit it with their hand. We need to see if they are allowed.
|
||||
if(allowed(user))
|
||||
access_granted = 1
|
||||
if(ishuman(user))
|
||||
users_name = FindNameFromID(user)
|
||||
else
|
||||
users_name = "Unknown"
|
||||
|
||||
if( ishuman(user) && !stat && ( istype(C, /obj/item/weapon/card/id) || istype(C, /obj/item/device/pda) ) )
|
||||
var/obj/item/weapon/card/id/ID = C
|
||||
|
||||
if( istype(C, /obj/item/device/pda) )
|
||||
var/obj/item/device/pda/pda = C
|
||||
ID = pda.id
|
||||
if(!istype(ID))
|
||||
ID = null
|
||||
|
||||
if(ID)
|
||||
users_name = ID.registered_name
|
||||
|
||||
if(check_access(ID))
|
||||
access_granted = 1
|
||||
|
||||
var/answer = "Yes"
|
||||
if(answer == "No")
|
||||
return
|
||||
if(user.stat || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1)
|
||||
user << "Sorry, you must remain able bodied and close to \the [src] in order to use it."
|
||||
return
|
||||
|
||||
if(alarmed && density && lockdown && !access_granted/* && !( users_name in users_to_open ) */)
|
||||
// Too many shitters on /vg/ for the honor system to work.
|
||||
user << "<span class='warning'>Access denied. Please wait for authorities to arrive, or for the alert to clear.</span>"
|
||||
return
|
||||
// End anti-shitter system
|
||||
/*
|
||||
user.visible_message("\red \The [src] opens for \the [user]",\
|
||||
"\The [src] opens after you acknowledge the consequences.",\
|
||||
"You hear a beep, and a door opening.")
|
||||
*/
|
||||
else
|
||||
user.visible_message("\blue \The [src] [density ? "open" : "close"]s for \the [user].",\
|
||||
"\The [src] [density ? "open" : "close"]s.",\
|
||||
"You hear a beep, and a door opening.")
|
||||
// Accountability!
|
||||
if(!users_to_open)
|
||||
users_to_open = list()
|
||||
users_to_open += users_name
|
||||
|
||||
var/needs_to_close = 0
|
||||
if(density)
|
||||
if(alarmed)
|
||||
needs_to_close = 1
|
||||
spawn()
|
||||
open()
|
||||
else
|
||||
spawn()
|
||||
close()
|
||||
|
||||
if(needs_to_close)
|
||||
spawn(50)
|
||||
if(alarmed)
|
||||
nextstate = CLOSED
|
||||
|
||||
|
||||
|
||||
@@ -285,11 +286,12 @@
|
||||
..()
|
||||
|
||||
if(density)
|
||||
pdiff = getOPressureDifferential(get_turf(src))
|
||||
|
||||
|
||||
var/changed = 0
|
||||
lockdown=0
|
||||
// Pressure alerts
|
||||
pdiff = getOPressureDifferential(src.loc)
|
||||
if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF)
|
||||
lockdown = 1
|
||||
if(!pdiff_alert)
|
||||
pdiff_alert = 1
|
||||
changed = 1 // update_icon()
|
||||
@@ -297,33 +299,28 @@
|
||||
if(pdiff_alert)
|
||||
pdiff_alert = 0
|
||||
changed = 1 // update_icon()
|
||||
var/list/temperatures = getCardinalTemperatures(src.loc)
|
||||
var/oldtdiff = tdiff_alert
|
||||
for(var/index = 1; index <= temperatures.len; index++)
|
||||
var/celsius = convert_k2c(temperatures[index])
|
||||
switch(index)
|
||||
if(1)
|
||||
if(celsius >= 50)
|
||||
tdiff_alert |= NORTHHOT
|
||||
else if(celsius <= 0)
|
||||
tdiff_alert |= NORTHCOLD
|
||||
if(2)
|
||||
if(celsius >= 50)
|
||||
tdiff_alert |= SOUTHHOT
|
||||
else if(celsius <= 0)
|
||||
tdiff_alert |= SOUTHCOLD
|
||||
if(3)
|
||||
if(celsius >= 50)
|
||||
tdiff_alert |= EASTHOT
|
||||
else if(celsius <= 0)
|
||||
tdiff_alert |= EASTCOLD
|
||||
if(4)
|
||||
if(celsius >= 50)
|
||||
tdiff_alert |= WESTHOT
|
||||
else if(celsius <= 0)
|
||||
tdiff_alert |= WESTCOLD
|
||||
|
||||
if(oldtdiff != tdiff_alert)
|
||||
tile_info = getCardinalAirInfo(src.loc,list("temperature","pressure"))
|
||||
var/old_alerts = dir_alerts
|
||||
for(var/index = 1; index <= 4; index++)
|
||||
var/list/tileinfo=tile_info[index]
|
||||
if(tileinfo==null)
|
||||
continue // Bad data.
|
||||
var/celsius = convert_k2c(tileinfo[1])
|
||||
|
||||
var/alerts=0
|
||||
|
||||
// Temperatures
|
||||
if(celsius >= FIREDOOR_MAX_TEMP)
|
||||
alerts |= FIREDOOR_ALERT_HOT
|
||||
lockdown = 1
|
||||
else if(celsius <= FIREDOOR_MIN_TEMP)
|
||||
alerts |= FIREDOOR_ALERT_COLD
|
||||
lockdown = 1
|
||||
|
||||
dir_alerts[index]=alerts
|
||||
|
||||
if(dir_alerts != old_alerts)
|
||||
changed = 1
|
||||
if(changed)
|
||||
update_icon()
|
||||
@@ -369,23 +366,13 @@
|
||||
overlays += "welded"
|
||||
if(pdiff_alert)
|
||||
overlays += "palert"
|
||||
if(tdiff_alert)
|
||||
if(tdiff_alert & NORTHCOLD)
|
||||
overlays += "calert_north"
|
||||
if(tdiff_alert & NORTHHOT)
|
||||
overlays += "halert_north"
|
||||
if(tdiff_alert & SOUTHCOLD)
|
||||
overlays += "calert_south"
|
||||
if(tdiff_alert & SOUTHHOT)
|
||||
overlays += "halert_south"
|
||||
if(tdiff_alert & WESTCOLD)
|
||||
overlays += "calert_west"
|
||||
if(tdiff_alert & WESTHOT)
|
||||
overlays += "halert_west"
|
||||
if(tdiff_alert & EASTCOLD)
|
||||
overlays += "calert_east"
|
||||
if(tdiff_alert & EASTHOT)
|
||||
overlays += "halert_east"
|
||||
if(dir_alerts)
|
||||
for(var/d=1;d<=4;d++)
|
||||
var/cdir = cardinal[d]
|
||||
// Loop while i = [1, 3], incrementing each loop
|
||||
for(var/i=1;i<=ALERT_STATES.len;i++) //
|
||||
if(dir_alerts[d] & (1<<(i-1))) // Check to see if dir_alerts[d] has the i-1th bit set.
|
||||
overlays += new /icon(icon,"alert_[ALERT_STATES[i]]",dir=cdir)
|
||||
else
|
||||
icon_state = "door_open"
|
||||
if(blocked)
|
||||
@@ -445,12 +432,3 @@
|
||||
//used in the AStar algorithm to determinate if the turf the door is on is passable
|
||||
/obj/machinery/door/firedoor/CanAStarPass()
|
||||
return !density
|
||||
|
||||
#undef NORTHCOLD
|
||||
#undef NORTHHOT
|
||||
#undef SOUTHCOLD
|
||||
#undef SOUTHHOT
|
||||
#undef WESTCOLD
|
||||
#undef WESTHOT
|
||||
#undef EASTCOLD
|
||||
#undef EASTHOT
|
||||
|
||||
+771
-985
File diff suppressed because it is too large
Load Diff
@@ -1,48 +1,3 @@
|
||||
/proc/seedify(var/obj/item/O as obj, var/t_max)
|
||||
var/t_amount = 0
|
||||
if(t_max == -1)
|
||||
t_max = rand(1,4)
|
||||
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new F.seed(O.loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
t_prod.maturation = F.maturation
|
||||
t_prod.production = F.production
|
||||
t_prod.yield = F.yield
|
||||
t_prod.potency = F.potency
|
||||
t_amount++
|
||||
del(O)
|
||||
return 1
|
||||
|
||||
else if(istype(O, /obj/item/weapon/grown/))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new F.seed(O.loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
t_prod.maturation = F.maturation
|
||||
t_prod.production = F.production
|
||||
t_prod.yield = F.yield
|
||||
t_prod.potency = F.potency
|
||||
t_amount++
|
||||
del(O)
|
||||
return 1
|
||||
|
||||
else if(istype(O, /obj/item/stack/tile/grass))
|
||||
var/obj/item/stack/tile/grass/S = O
|
||||
new /obj/item/seeds/grassseed(O.loc)
|
||||
S.use(1)
|
||||
return 1
|
||||
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/seed_extractor
|
||||
name = "seed extractor"
|
||||
desc = "Extracts and bags seeds from produce."
|
||||
@@ -52,14 +7,37 @@
|
||||
anchored = 1
|
||||
|
||||
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(isrobot(user))
|
||||
return
|
||||
user.drop_item()
|
||||
if(O && O.loc)
|
||||
O.loc = src.loc
|
||||
if(seedify(O,-1))
|
||||
user << "<span class='notice'>You extract some seeds.</span>"
|
||||
else
|
||||
user << "<span class='notice'>You can't extract any seeds from that!</span>"
|
||||
|
||||
// Fruits and vegetables.
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown))
|
||||
|
||||
user.drop_item(O)
|
||||
|
||||
var/datum/seed/new_seed_type
|
||||
if(istype(O, /obj/item/weapon/grown))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
new_seed_type = seed_types[F.plantname]
|
||||
else
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
new_seed_type = seed_types[F.plantname]
|
||||
|
||||
if(new_seed_type)
|
||||
user << "<span class='notice'>You extract some seeds from [O].</span>"
|
||||
var/produce = rand(1,4)
|
||||
for(var/i = 0;i<=produce;i++)
|
||||
var/obj/item/seeds/seeds = new(get_turf(src))
|
||||
seeds.seed_type = new_seed_type.name
|
||||
seeds.update_seed()
|
||||
else
|
||||
user << "[O] doesn't seem to have any usable seeds inside it."
|
||||
|
||||
del(O)
|
||||
|
||||
//Grass.
|
||||
else if(istype(O, /obj/item/stack/tile/grass))
|
||||
var/obj/item/stack/tile/grass/S = O
|
||||
user << "<span class='notice'>You extract some seeds from the [S.name].</span>"
|
||||
S.use(1)
|
||||
new /obj/item/seeds/grassseed(loc)
|
||||
|
||||
return
|
||||
@@ -283,12 +283,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
|
||||
/* --- Loop through the receivers and categorize them --- */
|
||||
|
||||
if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
|
||||
continue
|
||||
|
||||
if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
|
||||
continue
|
||||
|
||||
|
||||
// Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates
|
||||
if(data == 3 && istype(R, /mob/dead/observer) && R.client && (R.client.prefs.toggles & CHAT_GHOSTRADIO))
|
||||
continue
|
||||
@@ -617,8 +615,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
|
||||
/* --- Loop through the receivers and categorize them --- */
|
||||
|
||||
if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
|
||||
continue
|
||||
|
||||
|
||||
// --- Check for compression ---
|
||||
|
||||
@@ -78,7 +78,9 @@
|
||||
var/mob/M = new mobtype
|
||||
|
||||
if(ishuman(M) || isbrain(M))
|
||||
race = "Human"
|
||||
var/mob/living/carbon/human/H = M
|
||||
race = "[H.species.name]"
|
||||
|
||||
|
||||
else if(ismonkey(M))
|
||||
race = "Monkey"
|
||||
|
||||
@@ -106,13 +106,13 @@
|
||||
|
||||
var/atom/temp = new typepath(null)
|
||||
var/datum/data/vending_product/R = new /datum/data/vending_product()
|
||||
R.product_name = temp.name
|
||||
R.product_path = typepath
|
||||
R.amount = amount
|
||||
R.max_amount = amount
|
||||
R.price = price
|
||||
R.display_color = pick("red","blue","green")
|
||||
|
||||
sleep(3)
|
||||
R.product_name = temp.name
|
||||
if(hidden)
|
||||
hidden_records += R
|
||||
else if(req_coin)
|
||||
@@ -758,7 +758,7 @@
|
||||
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
|
||||
icon_state = "nutri"
|
||||
icon_deny = "nutri-deny"
|
||||
products = list(/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20,
|
||||
products = list(/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/plantspray/pests = 20,
|
||||
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
|
||||
|
||||
@@ -775,8 +775,7 @@
|
||||
/obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
|
||||
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3,
|
||||
/obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,
|
||||
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3,
|
||||
/obj/item/seeds/coffee_arabica_seed = 3, /obj/item/seeds/tobacco_seed = 3,/obj/item/seeds/tea_aspera_seed = 3)
|
||||
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)
|
||||
|
||||
contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2,
|
||||
/obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/obj/mecha/combat/durand/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
ME.attach(src)
|
||||
|
||||
@@ -16,16 +16,17 @@
|
||||
max_equip = 3
|
||||
var/squeak = 0
|
||||
|
||||
/*
|
||||
/obj/mecha/combat/honker/New()
|
||||
/obj/mecha/combat/honker/loaded/New()
|
||||
..()
|
||||
|
||||
weapons += new /datum/mecha_weapon/honker(src)
|
||||
weapons += new /datum/mecha_weapon/missile_rack/banana_mortar(src)
|
||||
weapons += new /datum/mecha_weapon/missile_rack/mousetrap_mortar(src)
|
||||
selected_weapon = weapons[1]
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/honker
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
|
||||
ME.attach(src)
|
||||
return
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/mecha/combat/honker/melee_action(target)
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
icon_state = "mecha_carbine"
|
||||
equip_cooldown = 5
|
||||
projectile = /obj/item/projectile/bullet/incendiary/mech
|
||||
projectiles = 24
|
||||
projectiles = 12
|
||||
projectile_energy_cost = 15
|
||||
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
equip_cooldown = 10
|
||||
projectile = /obj/item/projectile/bullet/weakbullet
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
projectiles = 300
|
||||
projectiles = 50
|
||||
projectile_energy_cost = 20
|
||||
var/projectiles_per_shot = 3
|
||||
var/deviation = 0.3
|
||||
@@ -299,11 +299,11 @@
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
name = "SRM-8 Missile Rack"
|
||||
name = "SRM-4 Missile Rack"
|
||||
icon_state = "mecha_missilerack"
|
||||
projectile = /obj/item/missile
|
||||
fire_sound = 'sound/effects/bang.ogg'
|
||||
projectiles = 8
|
||||
projectiles = 4
|
||||
projectile_energy_cost = 1000
|
||||
equip_cooldown = 60
|
||||
var/missile_speed = 2
|
||||
@@ -331,7 +331,7 @@
|
||||
|
||||
throw_impact(atom/hit_atom)
|
||||
if(primed)
|
||||
explosion(hit_atom, 0, 0, 2, 4)
|
||||
explosion(hit_atom,1,2,2)
|
||||
del(src)
|
||||
else
|
||||
..()
|
||||
@@ -345,7 +345,7 @@
|
||||
projectiles = 6
|
||||
missile_speed = 1.5
|
||||
projectile_energy_cost = 800
|
||||
equip_cooldown = 60
|
||||
equip_cooldown = 150
|
||||
var/det_time = 20
|
||||
size=1
|
||||
action(target)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(3,12)
|
||||
var/num = rand(2,6)
|
||||
for(var/i=0, i<num, i++)
|
||||
new /obj/effect/spider/spiderling(src.loc)
|
||||
del(src)
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
var/item_state = null
|
||||
var/r_speed = 1.0
|
||||
var/health = null
|
||||
var/burn_point = null
|
||||
var/burning = null
|
||||
var/hitsound = null
|
||||
var/w_class = 3.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
@@ -616,6 +614,8 @@
|
||||
)
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"]
|
||||
if(!eyes)
|
||||
return
|
||||
eyes.damage += rand(3,4)
|
||||
if(eyes.damage >= eyes.min_bruised_damage)
|
||||
if(M.stat != 2)
|
||||
@@ -687,4 +687,5 @@
|
||||
//not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made.
|
||||
for(var/obj/item/A in world)
|
||||
if(A.type == type && !A.blood_overlay)
|
||||
A.blood_overlay = I
|
||||
A.blood_overlay = image(I)
|
||||
|
||||
|
||||
@@ -894,7 +894,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
if(istype(M, /mob/new_player))
|
||||
continue
|
||||
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
|
||||
|
||||
investigate_log("<span class='game say'>PDA Message - <span class='name'>[U.key] - [owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>", "pda")
|
||||
if(!conversations.Find("\ref[P]"))
|
||||
conversations.Add("\ref[P]")
|
||||
if(!P.conversations.Find("\ref[src]"))
|
||||
|
||||
@@ -479,8 +479,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
var/list/heard_garbled = list() // garbled message
|
||||
|
||||
for (var/mob/R in receive)
|
||||
if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
|
||||
continue
|
||||
if (R.say_understands(M))
|
||||
if (ishuman(M) && M.GetVoice() != M.real_name)
|
||||
heard_masked += R
|
||||
@@ -824,4 +822,4 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if(isrobot(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
R.radio = null
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -16,7 +16,7 @@ Mineral Sheets
|
||||
*/
|
||||
|
||||
var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
|
||||
new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
|
||||
@@ -103,8 +103,9 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
|
||||
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
|
||||
new/datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \
|
||||
new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/rust_fuel_assembly_port_frame, 12, time = 50, one_per_turf = 1), \
|
||||
new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/rust_fuel_compressor_frame, 12, time = 50, one_per_turf = 1), \
|
||||
// new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/rust_fuel_assembly_port_frame, 12, time = 50, one_per_turf = 1), \
|
||||
// new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/rust_fuel_compressor_frame, 12, time = 50, one_per_turf = 1), \
|
||||
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/plasteel
|
||||
@@ -136,7 +137,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0), \
|
||||
new/datum/stack_recipe("drying rack", /obj/machinery/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/wood
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
message_admins(log_str)
|
||||
log_game(log_str)
|
||||
bombers += "[log_str]"
|
||||
user << "<span class='warning'>You prime the [name]! [det_time / 10] second\s!</span>"
|
||||
active = 1
|
||||
update_icon()
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
message_admins(log_str)
|
||||
log_game(log_str)
|
||||
bombers += "[log_str]"
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.throw_mode_on()
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
message_admins(log_str)
|
||||
log_game(log_str)
|
||||
bombers += "[log_str]"
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.throw_mode_on()
|
||||
|
||||
@@ -143,14 +143,6 @@
|
||||
M << "\red You are heated by the warmth of the of the [name]!"
|
||||
M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT
|
||||
|
||||
/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
|
||||
if(!proximity) return
|
||||
if(endurance > 0)
|
||||
endurance -= rand(1,(endurance/3)+1)
|
||||
else
|
||||
usr << "All the petals have fallen off the [name] from violent whacking."
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob)
|
||||
if(!user.gloves)
|
||||
user << "\red The [name] burns your bare hand!"
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
w_class = 1
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown", "/obj/item/stack/tile/grass")
|
||||
|
||||
|
||||
/*
|
||||
/obj/item/weapon/storage/bag/plants/portaseeder
|
||||
name = "Portable Seed Extractor"
|
||||
desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
|
||||
@@ -140,7 +140,7 @@
|
||||
for(var/mob/M in range(1))
|
||||
if (M.s_active == src)
|
||||
src.close(M)
|
||||
|
||||
*/
|
||||
|
||||
// -----------------------------
|
||||
// Sheet Snatcher
|
||||
|
||||
@@ -106,38 +106,55 @@
|
||||
|
||||
/obj/item/weapon/melee/baton/attack(mob/M, mob/user)
|
||||
if(status && (M_CLUMSY in user.mutations) && prob(50))
|
||||
user << "<span class='danger'>You accidentally hit yourself with [src]!</span>"
|
||||
user.Weaken(stunforce*3)
|
||||
user << "span class='danger'>You accidentally hit yourself with the [src]!</span>"
|
||||
user.Weaken(30)
|
||||
deductcharge(hitcost)
|
||||
return
|
||||
|
||||
|
||||
if(isrobot(M))
|
||||
..()
|
||||
return
|
||||
|
||||
if(!isliving(M))
|
||||
return
|
||||
var/mob/living/L = M
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(user.a_intent == "harm")
|
||||
..()
|
||||
playsound(loc, "swing_hit", 50, 1, -1)
|
||||
if(user.a_intent == "hurt")
|
||||
if(!..()) return
|
||||
H.visible_message("<span class='danger'>[M] has been beaten with the [src] by [user]!</span>")
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Beat [H.name] ([H.ckey]) with [src.name]</font>"
|
||||
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Beaten by [user.name] ([user.ckey]) with [src.name]</font>"
|
||||
msg_admin_attack("[user.name] ([user.ckey]) beat [H.name] ([H.ckey]) with [src.name] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
playsound(src.loc, "swing_hit", 50, 1, -1)
|
||||
|
||||
else if(!status)
|
||||
L.visible_message("<span class='warning'>[L] has been prodded with [src] by [user]. Luckily it was off.</span>")
|
||||
H.visible_message("<span class='warning'>[H] has been prodded with [src] by [user]. Luckily it was off.</span>")
|
||||
return
|
||||
|
||||
var/stunroll = (rand(1,100))
|
||||
|
||||
if(status)
|
||||
user.lastattacked = L
|
||||
L.lastattacker = user
|
||||
user.lastattacked = H
|
||||
H.lastattacker = user
|
||||
if(user == H) // Attacking yourself can't miss
|
||||
stunroll = 100
|
||||
if(stunroll < 40)
|
||||
H.visible_message("\red <B>[user] misses [H] with \the [src]!")
|
||||
msg_admin_attack("[key_name(user)] attempted to stun [key_name(H)] with the [src].")
|
||||
return
|
||||
H.Stun(stunforce)
|
||||
H.Weaken(stunforce)
|
||||
H.apply_effect(STUTTER, stunforce)
|
||||
|
||||
L.Stun(stunforce)
|
||||
L.Weaken(stunforce)
|
||||
L.apply_effect(STUTTER, stunforce)
|
||||
|
||||
L.visible_message("<span class='danger'>[L] has been stunned with [src] by [user]!</span>")
|
||||
H.visible_message("<span class='danger'>[H] has been stunned with [src] by [user]!</span>")
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
|
||||
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with the [src].")
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Stunned [H.name] ([H.ckey]) with [src.name]</font>"
|
||||
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by [user.name] ([user.ckey]) with [src.name]</font>"
|
||||
|
||||
if(isrobot(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R && R.cell)
|
||||
@@ -146,21 +163,6 @@
|
||||
deductcharge(hitcost)
|
||||
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Stunned [L.name] ([L.ckey]) with [name]</font>"
|
||||
L.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by [user.name] ([user.ckey]) with [name]</font>"
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) stunned [L.name] ([L.ckey]) with [name]</font>" )
|
||||
|
||||
if(!iscarbon(user))
|
||||
L.LAssailant = null
|
||||
else
|
||||
L.LAssailant = user
|
||||
|
||||
if(bcell.charge < hitcost)
|
||||
status = 0
|
||||
update_icon()
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/weapon/melee/baton/throw_impact(atom/hit_atom)
|
||||
. = ..()
|
||||
if (prob(50))
|
||||
@@ -224,4 +226,4 @@
|
||||
else if(!bcell)
|
||||
icon_state = "stunprod_nocell"
|
||||
else
|
||||
icon_state = "stunprod"
|
||||
icon_state = "stunprod"
|
||||
|
||||
@@ -249,3 +249,8 @@ obj/item/weapon/twohanded/
|
||||
/obj/item/weapon/twohanded/spear/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/twohanded/spear/kidan
|
||||
icon_state = "kidanspear0"
|
||||
name = "Kidan spear"
|
||||
desc = "A spear brought over from the Kidan homeworld."
|
||||
@@ -178,3 +178,13 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob)
|
||||
user << "<span class='notice'>You fasten the wirecutters to the top of the rod with the cable, prongs outward.</span>"
|
||||
del(I)
|
||||
del(src)
|
||||
|
||||
|
||||
/obj/item/weapon/spear/kidan
|
||||
icon_state = "kidanspear"
|
||||
name = "Kidan spear"
|
||||
desc = "A one-handed spear brought over from the Kidan homeworld."
|
||||
icon_state = "kidanspear"
|
||||
item_state = "kidanspear"
|
||||
force = 10
|
||||
throwforce = 15
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
var/damage = rand(15,30)
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!istype(M))
|
||||
if(!istype(H))
|
||||
H << "\red You land heavily!"
|
||||
M.adjustBruteLoss(damage)
|
||||
return
|
||||
|
||||
@@ -47,13 +47,10 @@
|
||||
..()
|
||||
sleep(2)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
new /obj/item/weapon/cartridge/hop(src)
|
||||
new /obj/item/device/radio/headset/heads/hop(src)
|
||||
new /obj/item/weapon/storage/box/ids(src)
|
||||
new /obj/item/weapon/storage/box/ids( src )
|
||||
new /obj/item/weapon/gun/energy/gun(src)
|
||||
new /obj/item/device/flash(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -76,6 +76,12 @@
|
||||
var/mineral = "metal"
|
||||
var/opening = 0
|
||||
|
||||
canSmoothWith = list(
|
||||
/turf/simulated/wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falserwall // WHY DO WE SMOOTH WITH FALSE R-WALLS WHEN WE DON'T SMOOTH WITH REAL R-WALLS.
|
||||
)
|
||||
|
||||
/obj/structure/falsewall/New()
|
||||
relativewall_neighbours()
|
||||
..()
|
||||
@@ -102,22 +108,8 @@
|
||||
icon_state = "[mineral]fwall_open"
|
||||
return
|
||||
|
||||
var/junction = 0 //will be used to determine from which side the wall is connected to other walls
|
||||
|
||||
for(var/turf/simulated/wall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falsewall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falserwall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)
|
||||
junction |= get_dir(src,W)
|
||||
var/junction=findSmoothingNeighbors(check_minerals=1)
|
||||
icon_state = "[mineral][junction]"
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/falsewall/attack_hand(mob/user as mob)
|
||||
@@ -237,6 +229,11 @@
|
||||
anchored = 1
|
||||
var/mineral = "metal"
|
||||
var/opening = 0
|
||||
canSmoothWith = list(
|
||||
/turf/simulated/wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falserwall // WHY DO WE SMOOTH WITH FALSE R-WALLS WHEN WE DON'T SMOOTH WITH REAL R-WALLS.
|
||||
)
|
||||
|
||||
/obj/structure/falserwall/New()
|
||||
relativewall_neighbours()
|
||||
@@ -272,25 +269,8 @@
|
||||
if(!density)
|
||||
icon_state = "frwall_open"
|
||||
return
|
||||
|
||||
var/junction = 0 //will be used to determine from which side the wall is connected to other walls
|
||||
|
||||
for(var/turf/simulated/wall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falsewall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falserwall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)
|
||||
junction |= get_dir(src,W)
|
||||
var/junction=findSmoothingNeighbors()
|
||||
icon_state = "rwall[junction]"
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/structure/falserwall/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(opening)
|
||||
|
||||
@@ -150,15 +150,10 @@
|
||||
desc = "This plaque commemorates the fall of the Atmos FEA division. For all the charred, dizzy, and brittle men who have died in its hands."
|
||||
icon_state = "atmosplaque"
|
||||
|
||||
/obj/structure/sign/double/maltesefalcon //The sign is 64x32, so it needs two tiles. ;3
|
||||
name = "The Maltese Falcon"
|
||||
desc = "The Maltese Falcon, Space Bar and Grill."
|
||||
|
||||
/obj/structure/sign/double/maltesefalcon/left
|
||||
icon_state = "maltesefalcon-left"
|
||||
|
||||
/obj/structure/sign/double/maltesefalcon/right
|
||||
icon_state = "maltesefalcon-right"
|
||||
/obj/structure/sign/kidanplaque
|
||||
name = "Kidan wall trophy"
|
||||
desc = "A dead and stuffed Diona nymph, mounted on a board."
|
||||
icon_state = "kidanplaque"
|
||||
|
||||
/obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map
|
||||
name = "\improper SCIENCE!"
|
||||
@@ -228,4 +223,5 @@
|
||||
/obj/structure/sign/directions/evac
|
||||
name = "\improper Escape Arm"
|
||||
desc = "A direction sign, pointing out which way escape shuttle dock is."
|
||||
icon_state = "direction_evac"
|
||||
icon_state = "direction_evac"
|
||||
|
||||
|
||||
@@ -72,6 +72,10 @@
|
||||
return
|
||||
|
||||
// Chair types
|
||||
/obj/structure/stool/bed/chair/wood
|
||||
autoignition_temperature = AUTOIGNITION_WOOD
|
||||
// TODO: Special ash subtype that looks like charred chair legs
|
||||
|
||||
/obj/structure/stool/bed/chair/wood/normal
|
||||
icon_state = "wooden_chair"
|
||||
name = "wooden chair"
|
||||
|
||||
@@ -518,6 +518,7 @@
|
||||
icon_state = "wood_table"
|
||||
parts = /obj/item/weapon/table_parts/wood
|
||||
health = 50
|
||||
autoignition_temperature = AUTOIGNITION_WOOD // TODO: Special ash subtype that looks like charred table legs.
|
||||
|
||||
/obj/structure/table/woodentable/attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
|
||||
+71
-128
@@ -1,117 +1,88 @@
|
||||
//Separate dm because it relates to two types of atoms + ease of removal in case it's needed.
|
||||
//Also assemblies.dm for falsewall checking for this when used.
|
||||
//I should really make the shuttle wall check run every time it's moved, but centcom uses unsimulated floors so !effort
|
||||
// OKAY I DON'T KNOW WHO THE FUCK ORIGINALLY CODED THIS BUT THEY ARE OFFICIALLY FIRED FOR BEING DRUNK AND STUPID
|
||||
// FUCK YOU MYSTERY CODERS
|
||||
// FOR THIS SHIT I'M GOING TO MAKE ALL MY COMMENTS IN CAPS
|
||||
|
||||
/atom/proc/relativewall() //atom because it should be useable both for walls and false walls
|
||||
if(istype(src,/turf/simulated/floor/vault)||istype(src,/turf/simulated/wall/vault)) //HACK!!!
|
||||
return
|
||||
/atom
|
||||
var/list/canSmoothWith=list() // TYPE PATHS I CAN SMOOTH WITH~~~~~
|
||||
|
||||
var/junction = 0 //will be used to determine from which side the wall is connected to other walls
|
||||
// MOVED INTO UTILITY FUNCTION FOR LESS DUPLICATED CODE.
|
||||
/atom/proc/findSmoothingNeighbors()
|
||||
// THIS IS A BITMAP BECAUSE NORTH/SOUTH/ETC ARE ALL BITFLAGS BECAUSE BYOND IS DUMB AND
|
||||
// DOESN'T FUCKING MAKE SENSE, BUT IT WORKS TO OUR ADVANTAGE
|
||||
var/junction = 0
|
||||
for(var/cdir in cardinal)
|
||||
var/turf/T = get_step(src,cdir)
|
||||
if(isSmoothableNeighbor(T))
|
||||
junction |= cdir
|
||||
continue // NO NEED FOR FURTHER SEARCHING IN THIS TILE
|
||||
for(var/atom/A in T)
|
||||
if(isSmoothableNeighbor(A))
|
||||
junction |= cdir
|
||||
break // NO NEED FOR FURTHER SEARCHING IN THIS TILE
|
||||
|
||||
if(!istype(src,/turf/simulated/shuttle/wall)) //or else we'd have wacky shuttle merging with walls action
|
||||
for(var/turf/simulated/wall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falsewall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falserwall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
junction |= get_dir(src,W)
|
||||
return junction
|
||||
|
||||
/* Commenting this out for now until we figure out what to do with shuttle smooth walls, if anything.
|
||||
As they are now, they sort of work screwy and may need further coding. Or just be scrapped.*/
|
||||
/*else
|
||||
for(var/turf/simulated/shuttle/wall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/machinery/shuttle/W in orange(src,1)) //stuff like engine and propulsion should merge with walls
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y))
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/machinery/door/W in orange(src,1)) //doors should not result in diagonal walls, it just looks ugly. checking if area is shuttle so it won't merge with the station
|
||||
if((abs(src.x-W.x)-abs(src.y-W.y)) && (istype(W.loc.loc,/area/shuttle) || istype(W.loc.loc,/area/supply)))
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/grille/W in orange(src,1)) //same for grilles. checking if area is shuttle so it won't merge with the station
|
||||
if((abs(src.x-W.x)-abs(src.y-W.y)) && (istype(W.loc.loc,/area/shuttle) || istype(W.loc.loc,/area/supply)))
|
||||
junction |= get_dir(src,W)*/
|
||||
/atom/proc/isSmoothableNeighbor(var/atom/A)
|
||||
return is_type_in_list(A,canSmoothWith)
|
||||
|
||||
if(istype(src,/turf/simulated/wall))
|
||||
var/turf/simulated/wall/wall = src
|
||||
wall.icon_state = "[wall.walltype][junction]"
|
||||
else if (istype(src,/obj/structure/falserwall))
|
||||
src.icon_state = "rwall[junction]"
|
||||
else if (istype(src,/obj/structure/falsewall))
|
||||
var/obj/structure/falsewall/fwall = src
|
||||
fwall.icon_state = "[fwall.mineral][junction]"
|
||||
/* else if(istype(src,/turf/simulated/shuttle/wall))
|
||||
var/newicon = icon;
|
||||
var/newiconstate = icon_state;
|
||||
if(junction!=5 && junction!=6 && junction!=9 && junction!=10) //if it's not diagonal, all is well, no additional calculations needed
|
||||
src.icon_state = "swall[junction]"
|
||||
else //if it's diagonal, we need to figure out if we're using the floor diagonal or the space diagonal sprite
|
||||
var/is_floor = 0
|
||||
for(var/turf/unsimulated/floor/F in orange(src,1))
|
||||
if(abs(src.x-F.x)-abs(src.y-F.y))
|
||||
if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
|
||||
is_floor = 1
|
||||
newicon = F.icon
|
||||
newiconstate = F.icon_state //we'll save these for later
|
||||
for(var/turf/simulated/floor/F in orange(src,1))
|
||||
if(abs(src.x-F.x)-abs(src.y-F.y))
|
||||
if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
|
||||
is_floor = 1
|
||||
newicon = F.icon
|
||||
newiconstate = F.icon_state //we'll save these for later
|
||||
for(var/turf/simulated/shuttle/floor/F in orange(src,1))
|
||||
if(abs(src.x-F.x)-abs(src.y-F.y))
|
||||
if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
|
||||
is_floor = 1
|
||||
newicon = F.icon
|
||||
newiconstate = F.icon_state //we'll save these for later
|
||||
if(is_floor) //if is_floor = 1, we use the floor diagonal sprite
|
||||
src.icon = newicon; //we'll set the floor's icon to the floor next to it and overlay the wall segment. shuttle floor sprites have priority
|
||||
src.icon_state = newiconstate; //
|
||||
src.overlays += icon('icons/turf/shuttle.dmi',"swall_f[junction]")
|
||||
else //otherwise, the space one
|
||||
src.icon_state = "swall_s[junction]"*/
|
||||
/turf/simulated/wall/isSmoothableNeighbor(var/atom/A)
|
||||
if(is_type_in_list(A,canSmoothWith))
|
||||
// COLON OPERATORS ARE TERRIBLE BUT I HAVE NO CHOICE
|
||||
if(src.mineral == A:mineral)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
return
|
||||
/**
|
||||
* WALL SMOOTHING SHIT
|
||||
*
|
||||
* IN /ATOM BECAUSE /TURFS ARE /ATOMS AND SO ARE /OBJ/STRUCTURE/FALSEWALLS
|
||||
* THIS IS STUPID BUT IS FAIRLY ELEGANT FOR BYOND
|
||||
*
|
||||
* HOWEVER, INSTEAD OF MAKING ONE BIG GODDAMN MONOLITHIC PROC LIKE A FUCKING
|
||||
* SHITTY FUNCTIONAL PROGRAMMER, WE WILL BE COOL AND MODERN AND USE INHERITANCE.
|
||||
*/
|
||||
/atom/proc/relativewall()
|
||||
return // DOES JACK SHIT BY DEFAULT. OLD BEHAVIOR WAS TO SPAM LOOPS ANYWAY.
|
||||
|
||||
/atom/proc/relativewall_neighbours()
|
||||
for(var/turf/simulated/wall/W in range(src,1))
|
||||
W.relativewall()
|
||||
for(var/obj/structure/falsewall/W in range(src,1))
|
||||
W.relativewall()
|
||||
W.update_icon()//Refreshes the wall to make sure the icons don't desync
|
||||
for(var/obj/structure/falserwall/W in range(src,1))
|
||||
W.relativewall()
|
||||
return
|
||||
/*
|
||||
* SEE? NOW WE ONLY HAVE TO PROGRAM THIS SHIT INTO WHAT WE WANT TO SMOOTH
|
||||
* INSTEAD OF BEING DUMB AND HAVING A BIG FUCKING IFTREE WITH TYPECHECKS
|
||||
* MY GOD, WE COULD EVEN MOVE THE CODE TO BE WITH THE REST OF THE WALL'S CODE!
|
||||
* HOW FUCKING INNOVATIVE. ISN'T INHERITANCE NICE?
|
||||
*
|
||||
* WE COULD STANDARDIZE THIS BUT EVERYONE'S A FUCKING SNOWFLAKE
|
||||
*/
|
||||
/turf/simulated/wall/relativewall()
|
||||
var/junction=findSmoothingNeighbors()
|
||||
icon_state = "[walltype][junction]" // WHY ISN'T THIS IN UPDATE_ICON OR SIMILAR
|
||||
|
||||
// AND NOW WE HAVE TO YELL AT THE NEIGHBORS FOR BEING LOUD AND NOT PAINTING WITH HOA-APPROVED COLORS
|
||||
/atom/proc/relativewall_neighbours(var/at=null)
|
||||
if(!at)
|
||||
at = get_turf(src)
|
||||
// OPTIMIZE BY NOT CHECKING FOR NEIGHBORS IF WE DON'T FUCKING SMOOTH
|
||||
if(canSmoothWith.len>0)
|
||||
for(var/cdir in cardinal)
|
||||
var/turf/T = get_step(src,cdir)
|
||||
if(isSmoothableNeighbor(T))
|
||||
T.relativewall()
|
||||
for(var/atom/A in T)
|
||||
if(isSmoothableNeighbor(A))
|
||||
A.relativewall()
|
||||
|
||||
/turf/simulated/wall/New()
|
||||
relativewall_neighbours()
|
||||
..()
|
||||
|
||||
/*/turf/simulated/shuttle/wall/New()
|
||||
|
||||
spawn(20) //testing if this will make /obj/machinery/shuttle and /door count - It does, it stays.
|
||||
if(src.icon_state in list("wall1", "wall", "diagonalWall", "wall_floor", "wall_space")) //so wizard den, syndie shuttle etc will remain black
|
||||
for(var/turf/simulated/shuttle/wall/W in range(src,1))
|
||||
W.relativewall()
|
||||
|
||||
..()*/
|
||||
|
||||
/turf/simulated/wall/Destroy()
|
||||
|
||||
//This proc performs really badly with qdel relativewall gets called a over ten thousand times. Commenting it out until I get to figure out what exactly goes wrong here. uc
|
||||
/* var/temploc = src.loc
|
||||
var/temploc = src.loc
|
||||
|
||||
spawn(10)
|
||||
for(var/turf/simulated/wall/W in range(temploc,1))
|
||||
W.relativewall()
|
||||
if(!del_suppress_resmoothing)
|
||||
spawn(10)
|
||||
relativewall_neighbours(at=temploc)
|
||||
|
||||
for(var/obj/structure/falsewall/W in range(temploc,1))
|
||||
W.relativewall()
|
||||
*/
|
||||
// JESUS WHY
|
||||
for(var/direction in cardinal)
|
||||
for(var/obj/effect/glowshroom/shroom in get_step(src,direction))
|
||||
if(!shroom.floor) //shrooms drop to the floor
|
||||
@@ -122,34 +93,6 @@
|
||||
|
||||
..()
|
||||
|
||||
/*/turf/simulated/shuttle/wall/Destroy()
|
||||
|
||||
var/temploc = src.loc
|
||||
|
||||
spawn(10)
|
||||
for(var/turf/simulated/shuttle/wall/W in range(temploc,1))
|
||||
W.relativewall()
|
||||
|
||||
..()*/
|
||||
|
||||
/turf/simulated/wall/relativewall()
|
||||
if(istype(src,/turf/simulated/wall/vault)) //HACK!!!
|
||||
return
|
||||
|
||||
var/junction = 0 //will be used to determine from which side the wall is connected to other walls
|
||||
|
||||
for(var/turf/simulated/wall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)//Only 'like' walls connect -Sieve
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falsewall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)
|
||||
junction |= get_dir(src,W)
|
||||
for(var/obj/structure/falserwall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
if(src.mineral == W.mineral)
|
||||
junction |= get_dir(src,W)
|
||||
var/turf/simulated/wall/wall = src
|
||||
wall.icon_state = "[wall.walltype][junction]"
|
||||
// DE-HACK
|
||||
/turf/simulated/wall/vault/relativewall()
|
||||
return
|
||||
@@ -6,4 +6,10 @@
|
||||
anchored = 1
|
||||
density = 1
|
||||
|
||||
/obj/structure/poopiepants
|
||||
/obj/structure/kidanstatue
|
||||
name = "Obsidian Kidan warrior statue"
|
||||
desc = "A beautifully carved and menacing statue of a Kidan warrior made out of obsidian. It looks very heavy."
|
||||
icon = 'icons/obj/decorations.dmi'
|
||||
icon_state = "kidanstatue"
|
||||
anchored = 1
|
||||
density = 1
|
||||
@@ -44,6 +44,15 @@ var/list/wood_icons = list("wood","wood-broken")
|
||||
else
|
||||
icon_regular_floor = icon_state
|
||||
|
||||
/turf/simulated/floor/ignite(var/temperature)
|
||||
on_fire=1
|
||||
visible_message("\The [src] bursts into flame!")
|
||||
overlays += image(fire_dmi,fire_sprite)
|
||||
spawn(rand(fire_time_min,fire_time_max) SECONDS)
|
||||
if(!on_fire)
|
||||
return
|
||||
burn_tile()
|
||||
|
||||
//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
// if ((istype(mover, /obj/machinery/vehicle) && !(src.burnt)))
|
||||
// if (!( locate(/obj/machinery/mass_driver, src) ))
|
||||
@@ -573,4 +582,4 @@ turf/simulated/floor/proc/update_icon()
|
||||
burnt = 0
|
||||
broken = 0
|
||||
else
|
||||
user << "\blue You need more welding fuel to complete this task."
|
||||
user << "\blue You need more welding fuel to complete this task."
|
||||
|
||||
@@ -21,10 +21,17 @@
|
||||
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
|
||||
|
||||
var/walltype = "metal"
|
||||
var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through.
|
||||
var/engraving, engraving_quality //engraving on the wall
|
||||
var/del_suppress_resmoothing = 0 // Do not resmooth neighbors on Destroy. (smoothwall.dm)
|
||||
canSmoothWith = list(
|
||||
/turf/simulated/wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falserwall // WHY DO WE SMOOTH WITH FALSE R-WALLS WHEN WE DON'T SMOOTH WITH REAL R-WALLS.
|
||||
)
|
||||
|
||||
/turf/simulated/wall/Del()
|
||||
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
|
||||
..()
|
||||
|
||||
/turf/simulated/wall/ChangeTurf(var/newtype)
|
||||
for(var/obj/effect/E in src) if(E.name == "Wallrot") del E
|
||||
@@ -457,7 +464,7 @@
|
||||
var/obj/item/light_fixture_frame/small/AH = W
|
||||
AH.try_build(src)
|
||||
return
|
||||
|
||||
/*
|
||||
else if(istype(W,/obj/item/rust_fuel_compressor_frame))
|
||||
var/obj/item/rust_fuel_compressor_frame/AH = W
|
||||
AH.try_build(src)
|
||||
@@ -467,7 +474,7 @@
|
||||
var/obj/item/rust_fuel_assembly_port_frame/AH = W
|
||||
AH.try_build(src)
|
||||
return
|
||||
|
||||
*/
|
||||
//Poster stuff
|
||||
else if(istype(W,/obj/item/weapon/contraband/poster))
|
||||
place_poster(W,user)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
F << "<small>[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
|
||||
|
||||
//ADMINVERBS
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes","singulo") )
|
||||
/client/proc/investigate_show( subject in list("hrefs","pda","singulo","gold core","cult") )
|
||||
set name = "Investigate"
|
||||
set category = "Admin"
|
||||
if(!holder) return
|
||||
@@ -48,3 +48,17 @@
|
||||
else
|
||||
src << "<font color='red'>Error: admin_investigate: Href Logging is not on.</font>"
|
||||
return
|
||||
|
||||
if("pda") //general one-round-only stuff
|
||||
var/F = investigate_subject2file(subject)
|
||||
if(!F)
|
||||
src << "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>"
|
||||
return
|
||||
src << browse(F,"window=investigate[subject];size=800x300")
|
||||
|
||||
if("cult")
|
||||
var/F = investigate_subject2file(subject)
|
||||
if(!F)
|
||||
src << "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>"
|
||||
return
|
||||
src << browse(F,"window=investigate[subject];size=800x300")
|
||||
@@ -131,8 +131,8 @@ var/list/admin_verbs_server = list(
|
||||
/client/proc/cmd_admin_change_custom_event,
|
||||
/client/proc/cmd_admin_create_centcom_report,
|
||||
/client/proc/cmd_admin_dress,
|
||||
/client/proc/response_team // Response Teams admin verb
|
||||
|
||||
/client/proc/response_team, // Response Teams admin verb
|
||||
/client/proc/nanomapgen_DumpImage
|
||||
)
|
||||
var/list/admin_verbs_debug = list(
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
@@ -397,7 +397,7 @@ var/list/admin_verbs_mod = list(
|
||||
set category = "Event"
|
||||
set name = "Give Spell"
|
||||
set desc = "Gives a spell to a mob."
|
||||
var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells
|
||||
var/obj/effect/proc_holder/spell/wizard/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells
|
||||
if(!S) return
|
||||
T.spell_list += new S
|
||||
T.update_power_buttons()
|
||||
|
||||
@@ -136,7 +136,7 @@ var/intercom_range_display_status = 0
|
||||
src.verbs += /client/proc/startSinglo
|
||||
src.verbs += /client/proc/cmd_admin_grantfullaccess
|
||||
src.verbs += /client/proc/kaboom
|
||||
src.verbs += /client/proc/splash
|
||||
// src.verbs += /client/proc/splash
|
||||
src.verbs += /client/proc/cmd_admin_areatest
|
||||
src.verbs += /client/proc/cmd_admin_rejuvenate
|
||||
src.verbs += /datum/admins/proc/show_traitor_panel
|
||||
|
||||
@@ -155,7 +155,7 @@ client/proc/one_click_antag()
|
||||
for(var/mob/G in respawnable_list)
|
||||
if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate"))
|
||||
spawn(0)
|
||||
switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No"))
|
||||
switch(G.timed_alert("Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","No",300,"Yes","No"))//alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No"))
|
||||
if("Yes")
|
||||
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
|
||||
return
|
||||
|
||||
@@ -18,7 +18,7 @@ var/global/vox_tick = 1
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
||||
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
|
||||
|
||||
var/obj/item/weapon/spikethrower/W = new(src)
|
||||
var/obj/item/weapon/gun/launcher/spikethrower/W = new(src)
|
||||
equip_to_slot_or_del(W, slot_r_hand)
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
var/coffin = 0
|
||||
|
||||
/obj/effect/landmark/corpse/initialize()
|
||||
if(istype(src,/obj/effect/landmark/corpse/clown))
|
||||
var/obj/effect/landmark/corpse/clown/C = src
|
||||
C.chooseRank()
|
||||
createCorpse()
|
||||
|
||||
/obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
|
||||
@@ -172,17 +175,36 @@
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/rig
|
||||
|
||||
/obj/effect/landmark/corpse/clown
|
||||
name = "Clown"
|
||||
corpseuniform = /obj/item/clothing/under/rank/clown
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/device/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsepocket1 = /obj/item/weapon/bikehorn
|
||||
corpseback = /obj/item/weapon/storage/backpack/clown
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown"
|
||||
corpseidaccess = "Clown"
|
||||
timeofdeath = -50000
|
||||
|
||||
/obj/effect/landmark/corpse/clown/proc/chooseRank()
|
||||
if(prob(10))
|
||||
name = "Clown Officer"
|
||||
corpseuniform = /obj/item/clothing/under/officeruniform
|
||||
corpsesuit = /obj/item/clothing/suit/officercoat
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/device/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsepocket1 = /obj/item/weapon/bikehorn
|
||||
corpseback = /obj/item/weapon/storage/backpack/clown
|
||||
corpsehelmet = /obj/item/clothing/head/naziofficer
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown Officer"
|
||||
corpseidaccess = "Clown"
|
||||
timeofdeath = -50000
|
||||
else
|
||||
name = "Clown Soldier"
|
||||
corpseuniform = /obj/item/clothing/under/soldieruniform
|
||||
corpsesuit = /obj/item/clothing/suit/soldiercoat
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/device/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsepocket1 = /obj/item/weapon/bikehorn
|
||||
corpseback = /obj/item/weapon/storage/backpack/clown
|
||||
corpsehelmet = /obj/item/clothing/head/stalhelm
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown Soldier"
|
||||
corpseidaccess = "Clown"
|
||||
timeofdeath = -50000
|
||||
|
||||
/obj/effect/landmark/corpse/clownking
|
||||
name = "Clown King"
|
||||
|
||||
@@ -13,7 +13,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
"alien candidate" = 1, //always show // 6
|
||||
"pAI candidate" = 1, // -- TLE // 7
|
||||
"cultist" = IS_MODE_COMPILED("cult"), // 8
|
||||
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
|
||||
"plant" = 1, // 9
|
||||
"ninja" = "true", // 10
|
||||
"vox raider" = IS_MODE_COMPILED("heist"), // 11
|
||||
"slime" = 1, // 12
|
||||
|
||||
@@ -26,15 +26,6 @@
|
||||
prefs.save_preferences(src)
|
||||
feedback_add_details("admin_verb","TGR")
|
||||
|
||||
/client/verb/toggle_hear_radio()
|
||||
set name = "Show/Hide RadioChatter"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle seeing radiochatter from radios and speakers"
|
||||
prefs.toggles ^= CHAT_RADIO
|
||||
prefs.save_preferences(src)
|
||||
usr << "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers"
|
||||
feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggleadminhelpsound()
|
||||
set name = "Hear/Silence Adminhelps"
|
||||
set category = "Preferences"
|
||||
|
||||
@@ -292,4 +292,27 @@
|
||||
/obj/item/clothing/head/fedora/brownfedora
|
||||
name = "brown fedora"
|
||||
icon_state = "bfedora"
|
||||
loose = 35
|
||||
loose = 35
|
||||
|
||||
/obj/item/clothing/head/stalhelm
|
||||
name = "Clown Stalhelm"
|
||||
desc = "The typical clown soldier's helmet."
|
||||
icon_state = "stalhelm"
|
||||
item_state = "stalhelm"
|
||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
/obj/item/clothing/head/panzer
|
||||
name = "Clown HONKMech Cap"
|
||||
desc = "The softcap worn by HONK Mech pilots."
|
||||
icon_state = "panzercap"
|
||||
item_state = "panzercap"
|
||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||
|
||||
/obj/item/clothing/head/naziofficer
|
||||
name = "Clown Officer Cap"
|
||||
desc = "The peaked clown officer's cap, disturbingly similar to the warden's."
|
||||
icon_state = "officercap"
|
||||
item_state = "officercap"
|
||||
flags = FPRINT | TABLEPASS | BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
@@ -406,4 +406,16 @@
|
||||
icon_state = "bomber"
|
||||
item_state = "bomber"
|
||||
flags = FPRINT | TABLEPASS
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
/obj/item/clothing/suit/officercoat
|
||||
name = "Clown Officer's Coat"
|
||||
desc = "A classy clown officer's overcoat, also designed by Hugo Boss."
|
||||
icon_state = "officersuit"
|
||||
item_state = "officersuit"
|
||||
|
||||
/obj/item/clothing/suit/soldiercoat
|
||||
name = "Clown Soldier's Coat"
|
||||
desc = "An overcoat for the clown soldier, to keep him warm during those cold winter nights on the front."
|
||||
icon_state = "soldiersuit"
|
||||
item_state = "soldiersuit"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user