Merge pull request #2 from ZomgPonies/master

Update
This commit is contained in:
SamCroswell
2014-07-26 21:47:23 -04:00
224 changed files with 35814 additions and 31657 deletions
+18 -32
View File
@@ -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
View File
@@ -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)
+12
View File
@@ -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"
+37
View File
@@ -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
+3 -1
View File
@@ -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
View File
@@ -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))
+5 -2
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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'
+1 -1
View File
@@ -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()
+11 -6
View File
@@ -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
+12 -3
View File
@@ -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
View File
@@ -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))
+5 -5
View File
@@ -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
+3 -3
View File
@@ -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
-26
View File
@@ -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
+3 -3
View File
@@ -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."
+8 -8
View File
@@ -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."
+5 -5
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+3 -3
View File
@@ -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.
+5 -5
View File
@@ -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
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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))
+24 -24
View File
@@ -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
+19 -2
View File
@@ -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
+8 -3
View File
@@ -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."
+7
View File
@@ -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
+13
View File
@@ -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
. = ..()
+3 -3
View File
@@ -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)
+20 -20
View File
@@ -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
+15 -15
View File
@@ -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
+1 -1
View File
@@ -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
+16 -260
View File
@@ -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])")
+8 -8
View File
@@ -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)
+29 -29
View File
@@ -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."
+3 -3
View File
@@ -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()
+3 -2
View File
@@ -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
+7 -3
View File
@@ -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
+4 -1
View File
@@ -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,
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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,
+1 -1
View File
@@ -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)
+11 -11
View File
@@ -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()
+1 -1
View File
@@ -241,4 +241,4 @@
else
if (sorttext(a.c_tag, b.c_tag) < 0)
L.Swap(j, j + 1)
return L
return L
+11 -11
View File
@@ -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
+87 -82
View File
@@ -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()
..()
+175 -197
View File
@@ -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 = "&nbsp;&nbsp;"
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
File diff suppressed because it is too large Load Diff
+32 -54
View File
@@ -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
+1 -5
View File
@@ -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 ---
+3 -1
View File
@@ -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"
+4 -5
View File
@@ -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)
+1 -1
View File
@@ -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)
+9 -8
View File
@@ -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)
+6 -6
View File
@@ -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)
+1 -1
View File
@@ -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)
+4 -3
View File
@@ -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)
+1 -1
View File
@@ -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
+34 -32
View File
@@ -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
+1 -1
View File
@@ -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
+13 -33
View File
@@ -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)
+6 -10
View File
@@ -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
View File
@@ -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
+7 -1
View File
@@ -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
+10 -1
View File
@@ -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."
+10 -3
View File
@@ -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)
+15 -1
View File
@@ -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")
+3 -3
View File
@@ -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()
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+33 -11
View File
@@ -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"
+1 -1
View File
@@ -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"
+24 -1
View File
@@ -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
+13 -1
View File
@@ -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