Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into findnreplace

# Conflicts:
#	code/game/machinery/recharger.dm
#	code/game/objects/items/devices/autopsy.dm
#	code/game/objects/items/devices/modkit.dm
#	code/game/objects/structures/lattice.dm
This commit is contained in:
Markolie
2017-04-14 18:15:12 +02:00
280 changed files with 2179 additions and 1512 deletions
+1 -1
View File
@@ -157,7 +157,7 @@ var/list/admin_verbs_debug = list(
/client/proc/enable_debug_verbs,
/client/proc/toggledebuglogs,
/client/proc/qdel_toggle,
/client/proc/gc_dump_hdl,
/client/proc/cmd_display_del_log,
/client/proc/debugNatureMapGenerator,
/client/proc/check_bomb_impacts,
/client/proc/test_movable_UI,
+1 -1
View File
@@ -157,7 +157,7 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(src), slot_r_hand)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)//Here you go Deuryn
var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(src)
L.imp_in = src
L.implanted = 1
sec_hud_set_implants()
@@ -51,8 +51,7 @@
mob_hunt_server.red_terminal = null
if(mob_hunt_server.blue_terminal == src)
mob_hunt_server.blue_terminal = null
if(avatar)
qdel(avatar)
QDEL_NULL(avatar)
return ..()
/obj/machinery/computer/mob_battle_terminal/attackby(obj/item/O, mob/user)
+1 -2
View File
@@ -12,8 +12,7 @@
sparks.attach(src)
/obj/item/device/assembly/igniter/Destroy()
qdel(sparks)
sparks = null
QDEL_NULL(sparks)
return ..()
+1 -3
View File
@@ -255,9 +255,7 @@
/obj/effect/beam/i_beam/Destroy()
if(master.first == src)
master.first = null
if(next)
qdel(next)
next = null
QDEL_NULL(next)
if(previous)
previous.next = null
master.last = previous
+2 -4
View File
@@ -10,10 +10,8 @@
flags = CONDUCT
/obj/item/assembly/shock_kit/Destroy()
qdel(part1)
part1 = null
qdel(part2)
part2 = null
QDEL_NULL(part1)
QDEL_NULL(part2)
return ..()
/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
@@ -18,6 +18,7 @@
if(water_timer)
deltimer(water_timer)
water_timer = null
return ..()
/obj/effect/waterfall/proc/drip()
var/obj/effect/effect/water/W = new(loc)
@@ -116,8 +116,7 @@
if(roomtimer)
deltimer(roomtimer)
roomtimer = null
qdel(card)
card = null
QDEL_NULL(card)
return ..()
/obj/machinery/door/unpowered/hotel_door/examine(mob/user)
@@ -220,9 +219,7 @@
vacant_rooms.Cut()
guests.Cut()
if(radio)
qdel(radio)
radio = null
QDEL_NULL(radio)
return ..()
+1
View File
@@ -70,6 +70,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
log_startup_progress(" No away missions found.")
return
/proc/createALLZlevels()
if(awaydestinations.len) //crude, but it saves another var!
return
+1 -2
View File
@@ -111,8 +111,7 @@
init(R)
/turf/unsimulated/floor/upperlevel/Destroy()
qdel(sensor)
sensor = null
QDEL_NULL(sensor)
return ..()
/turf/unsimulated/floor/upperlevel/proc/init(var/obj/effect/levelref/R)
@@ -63,16 +63,14 @@
desc = "Horrendous and awful. It smells like cancer. The fact it has wires attached to it is incidental."
var/obj/item/weapon/stock_parts/cell/cell = null
var/stun_strength = 5
var/stun_cost = 3750
var/stun_cost = 2000
/obj/item/clothing/gloves/color/yellow/stun/New()
..()
update_icon()
/obj/item/clothing/gloves/color/yellow/stun/Destroy()
if(cell)
qdel(cell)
cell = null
QDEL_NULL(cell)
return ..()
/obj/item/clothing/gloves/color/yellow/stun/Touch(atom/A, proximity)
+2 -4
View File
@@ -165,10 +165,8 @@
M.unEquip(piece)
qdel(piece)
processing_objects -= src
qdel(wires)
wires = null
qdel(spark_system)
spark_system = null
QDEL_NULL(wires)
QDEL_NULL(spark_system)
return ..()
/obj/item/weapon/rig/proc/suit_is_deployed()
+1 -1
View File
@@ -10,7 +10,7 @@
..()
/obj/item/clothing/suit/hooded/Destroy()
qdel(hood)
QDEL_NULL(hood)
return ..()
/obj/item/clothing/suit/hooded/proc/MakeHood()
+1 -2
View File
@@ -9,8 +9,7 @@
pockets.max_combined_w_class = 4
/obj/item/clothing/suit/storage/Destroy()
qdel(pockets)
pockets = null
QDEL_NULL(pockets)
return ..()
/obj/item/clothing/suit/storage/attack_hand(mob/user as mob)
@@ -386,9 +386,7 @@
var/obj/item/weapon/card/id/access_id
/obj/item/clothing/accessory/petcollar/Destroy()
if(access_id)
qdel(access_id)
access_id = null
QDEL_NULL(access_id)
processing_objects -= src
return ..()
+1 -1
View File
@@ -761,7 +761,7 @@
..()
/obj/item/clothing/under/contortionist/dropped(mob/living/carbon/human/user)
if(!user.get_int_organ(/obj/item/organ/internal/gland/ventcrawling))
if(!user.get_int_organ(/obj/item/organ/internal/heart/gland/ventcrawling))
user.ventcrawler = 0
..()
+30 -4
View File
@@ -235,6 +235,33 @@
to_chat(target, "<span class='notice'>You comb your tail with the [src].</span>")
used = 1
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael steampunk_witch
name = "stun baton converstion kit"
desc = "Some sci-fi looking parts for a stun baton."
icon = 'icons/obj/custom_items.dmi'
icon_state = "scifikit"
w_class = 2
/obj/item/device/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
if(istype(target, /obj/item/weapon/melee/baton) && !istype(target, /obj/item/weapon/melee/baton/cattleprod))
to_chat(user, "<span class='notice'>You modify the appearance of [target].</span>")
//because batons use the initial() proc, we can't just swap the icon state, sadly
var/obj/item/weapon/melee/baton/the_baton = target
the_baton.base_icon = "desolate_baton"
the_baton.item_state = "desolate_baton"
the_baton.icon = 'icons/obj/custom_items.dmi'
the_baton.lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
the_baton.righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
the_baton.update_icon()
user.update_icons()
qdel(src)
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery
name = "welding helmet modkit"
desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!"
@@ -244,14 +271,14 @@
throwforce = 0
/obj/item/device/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.lying)
if(!proximity || !ishuman(user) || user.incapacitated())
return
if(istype(target, /obj/item/clothing/head/welding))
to_chat(user, "<span class='notice'>You modify the appearance of [target].</span>")
var/obj/item/clothing/head/welding/flamedecal/P = new(get_turf(target))
transfer_fingerprints_to(P)
target.transfer_fingerprints_to(P)
qdel(target)
qdel(src)
return
@@ -269,7 +296,7 @@
throwforce = 0
/obj/item/device/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.lying)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
@@ -744,4 +771,3 @@
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass(src)
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass(src)
new /obj/item/weapon/reagent_containers/food/drinks/bottle/fluff/moonshine(src)
@@ -29,6 +29,7 @@
vendingMachines.Remove(originMachine)
originMachine.shut_up = 0
originMachine.shoot_inventory = 1
log_debug("Original brand intelligence machine: [originMachine] [ADMIN_VV(originMachine)] [ADMIN_JMP(originMachine)]")
/datum/event/brand_intelligence/tick()
if(!originMachine || !isnull(originMachine.gcDestroyed) || originMachine.shut_up || originMachine.wires.IsAllCut()) //if the original vending machine is missing or has it's voice switch flipped
+4 -13
View File
@@ -1218,28 +1218,19 @@
var/monkey_type = "Monkey"
list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity)
if(!proximity)
return
if(istype(O, /obj/structure/sink))
to_chat(user, "<span class='notice'>You place [src] under a stream of water...</span>")
user.drop_item()
forceMove(get_turf(O))
return Expand()
..()
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
if(volume >= 5)
return Expand()
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
if(do_after(user, 40, target = source))
return 1
user.drop_item()
forceMove(get_turf(source))
return 1
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
if(isnull(gcDestroyed))
visible_message("<span class='notice'>[src] expands!</span>")
new/mob/living/carbon/human(get_turf(src),monkey_type)
new/mob/living/carbon/human(get_turf(src), monkey_type)
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube
@@ -50,8 +50,7 @@
wires = new/datum/wires/smartfridge(src)
/obj/machinery/smartfridge/Destroy()
qdel(wires)
wires = null
QDEL_NULL(wires)
for(var/atom/movable/A in contents)
A.forceMove(loc)
return ..()
@@ -7,8 +7,12 @@
#define GC_FORCE_DEL_PER_TICK 30
//#define GC_DEBUG
// A list of types that were queued in the GC, and had to be soft deleted; used in testing
var/list/gc_hard_del_types = list()
var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened.
// the types are stored as strings
var/list/sleptDestroy = list() //Same as above but these are paths that slept during their Destroy call
var/list/noqdelhint = list() // list of all types that do not return a QDEL_HINT
var/global/datum/controller/process/garbage_collector/garbageCollector
// The time a datum was destroyed by the GC, or null if it hasn't been
@@ -82,7 +86,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
#undef GC_COLLECTIONS_PER_TICK
/datum/controller/process/garbage_collector/proc/hardDel(var/datum/D)
gc_hard_del_types |= D.type
didntgc["[D.type]"]++
D.hard_deleted = 1
if(!D.gcDestroyed)
spawn(-1)
@@ -126,6 +130,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
return
if(!isnull(D.gcDestroyed) && D.gcDestroyed != world.time)
gcwarning("Sleep detected in Destroy() call of [D.type]")
sleptDestroy["[D.type]"]++
D.gcDestroyed = world.time
switch(hint)
@@ -155,7 +160,9 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
#endif
garbageCollector.addTrash(D)
else
// to_chat(world, "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!")
if(!noqdelhint["[D.type]"])
noqdelhint["[D.type]"] = "[D.type]"
gcwarning("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.")
garbageCollector.addTrash(D)
+15 -9
View File
@@ -13,21 +13,27 @@
log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].")
message_admins("<span class='notice'>[key_name_admin(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].</span>", 1)
/client/proc/gc_dump_hdl()
set name = "(GC) Hard Del List"
set desc = "List types that are hard del()'d by the GC."
/client/proc/cmd_display_del_log()
set category = "Debug"
set name = "(GC) Display del() Log"
set desc = "Displays a list of things that have failed to GC this round"
if(!check_rights(R_DEBUG))
return
if(!gc_hard_del_types || !gc_hard_del_types.len)
to_chat(usr, "<span class='notice'>No hard del()'d types found.</span>")
return
var/dat = "<B>List of things that failed to GC this round</B><BR><BR>"
for(var/path in didntgc)
dat += "[path] - [didntgc[path]] times<BR>"
to_chat(usr, "Types hard del()'d by the GC:")
for(var/A in gc_hard_del_types)
to_chat(usr, "[A]")
dat += "<B>List of paths that did not return a qdel hint in Destroy()</B><BR><BR>"
for(var/path in noqdelhint)
dat += "[path]<BR>"
dat += "<B>List of paths that slept in Destroy()</B><BR><BR>"
for(var/path in sleptDestroy)
dat += "[path]<BR>"
usr << browse(dat, "window=dellog")
#ifdef TESTING
/client/var/running_find_references
+3 -4
View File
@@ -31,9 +31,8 @@
RefreshParts()
/obj/machinery/biogenerator/Destroy()
if(beaker)
qdel(beaker)
beaker = null
QDEL_NULL(beaker)
QDEL_NULL(files)
return ..()
/obj/machinery/biogenerator/ex_act(severity)
@@ -208,7 +207,7 @@
/obj/machinery/biogenerator/attack_hand(mob/user)
interact(user)
/obj/machinery/biogenerator/attack_ghost(mob/user)
interact(user)
+22 -9
View File
@@ -24,13 +24,22 @@
/obj/machinery/plantgenes/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/circuitboard/plantgenes(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
RefreshParts()
/obj/machinery/plantgenes/Destroy()
core_genes.Cut()
reagent_genes.Cut()
trait_genes.Cut()
target = null
QDEL_NULL(seed)
QDEL_NULL(disk)
return ..()
/obj/machinery/plantgenes/RefreshParts()
rating = 0
for(var/I in component_parts)
@@ -90,7 +99,7 @@
if(..())
return
interact(user)
/obj/machinery/plantgenes/attack_ghost(mob/user)
interact(user)
@@ -282,9 +291,9 @@
repaint_seed()
if("extract")
if(disk && !disk.read_only)
disk.gene = G
if(istype(G, /datum/plant_gene/core/potency))
var/datum/plant_gene/core/gene = G
disk.gene = G.Copy()
if(istype(disk.gene, /datum/plant_gene/core/potency))
var/datum/plant_gene/core/gene = disk.gene
gene.value = min(gene.value, max_extract_pot)
disk.update_name()
qdel(seed)
@@ -370,6 +379,10 @@
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/weapon/disk/plantgene/Destroy()
QDEL_NULL(gene)
return ..()
/obj/item/weapon/disk/plantgene/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/pen))
+3 -1
View File
@@ -39,7 +39,9 @@
transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
add_juice()
/obj/item/weapon/reagent_containers/food/snacks/grown/Destroy()
QDEL_NULL(seed)
return ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/add_juice()
if(reagents)
@@ -31,6 +31,9 @@
transform *= TransformUsingVariable(seed.potency, 100, 0.5)
add_juice()
/obj/item/weapon/grown/Destroy()
QDEL_NULL(seed)
return ..()
/obj/item/weapon/grown/attackby(obj/item/O, mob/user, params)
..()
+1 -3
View File
@@ -75,9 +75,7 @@
plant_hud_set_water()
/obj/machinery/hydroponics/Destroy()
if(myseed)
qdel(myseed)
myseed = null
QDEL_NULL(myseed)
return ..()
/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params)
+6
View File
@@ -68,6 +68,12 @@
for(var/reag_id in reagents_add)
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
/obj/item/seeds/Destroy()
for(var/thing in genes)
qdel(thing)
genes.Cut()
return ..()
/obj/item/seeds/proc/Copy()
var/obj/item/seeds/S = new type(null, 1)
// Copy all the stats
+1 -3
View File
@@ -79,7 +79,7 @@ var/list/karma_spenders = list()
to_chat(src, "<span class='warning'>You can't spend karma on someone connected from the same IP.</span>")
return 0
return 1
/mob/verb/spend_karma_list()
set name = "Award Karma"
@@ -118,8 +118,6 @@ var/list/karma_spenders = list()
if(!M)
to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.")
return
if(!can_give_karma_to_mob(M))
return
if(alert("Give [M.name] good karma?", "Karma", "Yes", "No") != "Yes")
return
if(!can_give_karma_to_mob(M))
@@ -33,7 +33,7 @@
if(bag)
bag.loc = user
bag.attackby(W, user, params)
/obj/item/device/shared_storage/attack_self(mob/living/carbon/user)
if(!iscarbon(user))
return
@@ -116,7 +116,7 @@
H.adjustBruteLoss(20)
H.emote("scream")
..()*/
//Boat
/obj/vehicle/lavaboat
@@ -183,7 +183,7 @@
generic_pixel_y = 2
generic_pixel_x = 1
vehicle_move_delay = 1
// Wisp Lantern
/obj/item/device/wisp_lantern
name = "spooky lantern"
@@ -238,16 +238,16 @@
layer = ABOVE_ALL_MOB_LAYER
light_power = 1
light_range = 7
//Red/Blue Cubes
/obj/item/device/warp_cube
name = "blue cube"
desc = "A mysterious blue cube."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "blue_cube"
var/obj/item/device/warp_cube/linked
/obj/item/device/warp_cube/Destroy()
if(linked)
linked.linked = null
@@ -260,14 +260,14 @@
return
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
smoke.set_up(1, 0, user.loc)
smoke.set_up(1, 0, user.loc)
smoke.start()
user.forceMove(get_turf(linked))
feedback_add_details("warp_cube","[src.type]")
var/datum/effect/system/harmless_smoke_spread/smoke2 = new /datum/effect/system/harmless_smoke_spread()
smoke2.set_up(1, 0, user.loc)
smoke2.set_up(1, 0, user.loc)
smoke2.start()
/obj/item/device/warp_cube/red
@@ -281,7 +281,7 @@
var/obj/item/device/warp_cube/blue = new(src.loc)
linked = blue
blue.linked = src
//Meat Hook
/obj/item/weapon/gun/magic/hook
@@ -329,9 +329,9 @@
L.forceMove(get_turf(firer))
/obj/item/projectile/hook/Destroy()
qdel(chain)
QDEL_NULL(chain)
return ..()
//Immortality Talisman
/obj/item/device/immortality_talisman
+1
View File
@@ -226,6 +226,7 @@
/obj/item/device/mobcapsule/Destroy()
if(captured)
captured.ghostize()
qdel(captured)
captured = null
return ..()
+3 -4
View File
@@ -62,7 +62,7 @@
points = 1
refined_type = /obj/item/stack/sheet/glass
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
/obj/item/weapon/ore/glass/basalt
name = "volcanic ash"
icon_state = "volcanic_sand"
@@ -163,8 +163,7 @@
var/datum/wires/explosive/gibtonite/wires
/obj/item/weapon/twohanded/required/gibtonite/Destroy()
qdel(wires)
wires = null
QDEL_NULL(wires)
return ..()
/obj/item/weapon/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params)
@@ -192,7 +191,7 @@
quality = 1
return
..()
/obj/item/weapon/twohanded/required/gibtonite/attack_ghost(mob/user)
if(wires)
wires.Interact(user)
@@ -220,7 +220,7 @@
threatcount += 4
//Mindshield implants imply trustworthyness
if(isloyal(src))
if(ismindshielded(src))
threatcount -= 1
return threatcount
+2 -6
View File
@@ -167,12 +167,8 @@
if(isrobot(loc))
var/mob/living/silicon/robot/borg = loc
borg.mmi = null
if(brainmob)
qdel(brainmob)
brainmob = null
if(held_brain)
qdel(held_brain)
held_brain = null
QDEL_NULL(brainmob)
QDEL_NULL(held_brain)
return ..()
/obj/item/device/mmi/syndie
@@ -123,7 +123,5 @@
icon_state = "scroll"
/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs.
if(brainmob)
qdel(brainmob)
brainmob = null
QDEL_NULL(brainmob)
return ..()
+54 -7
View File
@@ -53,6 +53,19 @@
if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
return
if("clack", "clacks")
if(species.name == "Kidan") //Only Kidan can clack and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("click", "clicks")
if(species.name == "Kidan") //Only Kidan can click and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("scream", "screams")
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
@@ -163,6 +176,40 @@
playsound(loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
if("clack", "clacks")
var/M = null
if(param)
for(var/mob/A in view(null, null))
if(param == A.name)
M = A
break
if(!M)
param = null
if(param)
message = "<B>[src]</B> clacks their mandibles at [param]."
else
message = "<B>[src]</B> clacks their mandibles."
playsound(loc, 'sound/effects/Kidanclack.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
if("click", "clicks")
var/M = null
if(param)
for(var/mob/A in view(null, null))
if(param == A.name)
M = A
break
if(!M)
param = null
if(param)
message = "<B>[src]</B> clicks their mandibles at [param]."
else
message = "<B>[src]</B> clicks their mandibles."
playsound(loc, 'sound/effects/Kidanclack2.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
if("yes")
var/M = null
if(param)
@@ -225,12 +272,12 @@
if(!restrained())
message = "<B>[src]</B> is strumming the air and headbanging like a safari chimp."
m_type = 1
if("dance")
if(!restrained())
message = "<B>[src]</B> dances around happily."
m_type = 1
if("jump")
if(!restrained())
message = "<B>[src]</B> jumps!"
@@ -836,11 +883,11 @@
// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
if(locate(/obj/item/weapon/storage/bible) in get_turf(src))
to_chat(viewers(src), "<span class='warning'><b>[src] farts on the Bible!</b></span>")
var/image/cross = image('icons/obj/storage.dmi',"bible")
var/adminbfmessage = "\blue [bicon(cross)] <b><font color=red>Bible Fart: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=[UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b>"
for(var/client/X in admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, adminbfmessage)
var/image/cross = image('icons/obj/storage.dmi',"bible")
var/adminbfmessage = "\blue [bicon(cross)] <b><font color=red>Bible Fart: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=[UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b>"
for(var/client/X in admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, adminbfmessage)
else if(TOXIC_FARTS in mutations)
message = "<b>[src]</b> unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
else if(SUPER_FART in mutations)
@@ -1892,7 +1892,7 @@
//Mindshield implants imply slight trustworthiness
if(isloyal(src))
if(ismindshielded(src))
threatcount -= 1
//Agent cards lower threatlevel.
@@ -1,7 +1,7 @@
var/global/default_martial_art = new/datum/martial_art
/mob/living/carbon/human
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
+2 -1
View File
@@ -1181,7 +1181,8 @@
else
AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
adjustBruteLoss(1)
Paralyse(4)
adjustBruteLoss(2)
@@ -18,7 +18,7 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
flags = HAS_LIPS | NO_BLOOD | NO_BREATHE
flags = HAS_LIPS | NO_BLOOD | NO_BREATHE | NOGUNS
oxy_mod = 0
@@ -27,11 +27,14 @@
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
blood_color = "#FF5AFF"
female_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys
/datum/species/abductor/can_understand(var/mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
return 1
/datum/species/abductor/handle_post_spawn(var/mob/living/carbon/human/H)
/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
H.gender = NEUTER
if(H.mind)
H.mind.abductor = new /datum/abductor
@@ -486,7 +486,7 @@
brute_mod = 0.8
flags = IS_WHITELISTED
clothing_flags = HAS_SOCKS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_CLAWS | HAS_HEAD_ACCESSORY
eyes = "kidan_eyes_s"
dietflags = DIET_HERB
@@ -512,6 +512,8 @@
"is attempting to bite their antenna off!",
"is jamming their claws into their eye sockets!",
"is twisting their own neck!",
"is cracking their exoskeleton!",
"is stabbing themselves with their mandibles!",
"is holding their breath!")
/datum/species/slime
@@ -189,7 +189,7 @@
to_chat(target, "<span class='danger'>You feel yourself agreeing with [user], and a surge of loyalty begins building.</span>")
target.Weaken(12)
sleep(20)
if(isloyal(target))
if(ismindshielded(target))
to_chat(user, "<span class='notice'>They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.</span>")
user.visible_message("<span class='danger'>[user] stops talking for a moment, then moves back away from [target].</span>")
to_chat(target, "<span class='danger'>Your mindshield implant activates, protecting you from conversion.</span>")
+52 -15
View File
@@ -246,7 +246,7 @@ var/list/ai_verbs_default = list(
ai_list -= src
shuttle_caller_list -= src
shuttle_master.autoEvac()
qdel(eyeobj) // No AI, no Eye
QDEL_NULL(eyeobj) // No AI, no Eye
malfhack = null
return ..()
@@ -299,22 +299,59 @@ var/list/ai_verbs_default = list(
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
if(Entry.len < 2 || Entry[1] != "ai") //ignore incorrectly formatted entries or entries that aren't marked for AI
continue
if(Entry.len < 3 && Entry[1] == ckey && Entry[2] == real_name)
custom_sprite = 1 //They're in the list? Custom sprite time
icon = 'icons/mob/custom-synthetic.dmi'
if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
var/display_choices = list(
"Monochrome",
"Blue",
"Clown",
"Inverted",
"Text",
"Smiley",
"Angry",
"Dorf",
"Matrix",
"Bliss",
"Firewall",
"Green",
"Red",
"Static",
"Triumvirate",
"Triumvirate Static",
"Red October",
"Sparkles",
"ANIMA",
"President",
"NT",
"NT2",
"Rainbow",
"Angel",
"Heartline",
"Hades",
"Helios",
"Syndicat Meow",
"Too Deep",
"Goon",
"Murica",
"Fuzzy",
"Glitchman",
"House",
"Database"
)
if(custom_sprite)
display_choices += "Custom"
//if(icon_state == initial(icon_state))
var/icontype = ""
if(custom_sprite == 1)
icontype = ("Custom")//automagically selects custom sprite if one is available
else
icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT", "NT2", "Rainbow", "Angel", "Heartline", "Hades", "Helios", "Syndicat Meow", "Too Deep", "Goon", "Murica", "Fuzzy", "Glitchman", "House", "Database")
icontype = input("Select an icon!", "AI", null, null) in display_choices
icon = 'icons/mob/AI.dmi' //reset this in case we were on a custom sprite and want to change to a standard one
switch(icontype)
if("Custom")
icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi' //set this here so we can use the custom_sprite
icon_state = "[ckey]-ai"
if("Clown")
icon_state = "ai-clown"
@@ -859,10 +896,10 @@ var/list/ai_verbs_default = list(
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 3)
if(Entry.len < 2 || Entry[1] != "hologram")
continue
if (Entry[1] == ckey && Entry[2] == real_name && Entry[3] == "Hologram") //Custom holograms
if (Entry[2] == ckey) //Custom holograms
custom_hologram = 1 // option is given in hologram menu
var/input
@@ -971,10 +1008,10 @@ var/list/ai_verbs_default = list(
if("ancient machine")
holo_icon = getHologramIcon(icon('icons/mob/ancient_machine.dmi', "ancient_machine"))
if("custom")
if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic.dmi'))
holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic.dmi', "[ckey]-ai-holo"))
else if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic64.dmi'))
holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic64.dmi', "[ckey]-ai-holo"))
if("[ckey]-ai-holo" in icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi'))
holo_icon = getHologramIcon(icon('icons/mob/custom_synthetic/custom-synthetic.dmi', "[ckey]-ai-holo"))
else if("[ckey]-ai-holo" in icon_states('icons/mob/custom_synthetic/custom-synthetic64.dmi'))
holo_icon = getHologramIcon(icon('icons/mob/custom_synthetic/custom-synthetic64.dmi', "[ckey]-ai-holo"))
else
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
+47 -8
View File
@@ -81,6 +81,7 @@
var/translator_on = 0 // keeps track of the translator module
var/current_pda_messaging = null
var/custom_sprite = 0
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
loc = paicard
@@ -394,17 +395,47 @@
set category = "pAI Commands"
set name = "Choose Chassis"
var/list/my_choices = list()
var/choice
var/finalized = "No"
//check for custom_sprite
if(!custom_sprite)
var/file = file2text("config/custom_sprites.txt")
var/lines = splittext(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = splittext(line, ":")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2 || Entry[1] != "pai") //ignore incorrectly formatted entries or entries that aren't marked for pAI
continue
if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
my_choices["Custom"] = "[ckey]-pai"
my_choices = possible_chassis.Copy()
if(custom_sprite)
my_choices["Custom"] = "[ckey]-pai"
if(loc == card) //don't let them continue in card form, since they won't be able to actually see their new mobile form sprite.
to_chat(src, "<span class='warning'>You must be in your mobile form to reconfigure your chassis.</span>")
return
while(finalized == "No" && client)
choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in possible_chassis
choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in my_choices
if(!choice) return
icon_state = possible_chassis[choice]
if(choice == "Custom")
icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
else
icon = 'icons/mob/pai.dmi'
icon_state = my_choices[choice]
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
chassis = possible_chassis[choice]
chassis = my_choices[choice]
verbs -= /mob/living/silicon/pai/proc/choose_chassis
/mob/living/silicon/pai/proc/choose_verbs()
@@ -562,15 +593,23 @@
// Handle being picked up.
/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber)
/mob/living/silicon/pai/get_scooped(mob/living/carbon/grabber)
var/obj/item/weapon/holder/H = ..()
if(!istype(H))
return
if(resting)
icon_state = "[chassis]"
resting = 0
H.icon_state = "pai-[icon_state]"
H.item_state = "pai-[icon_state]"
if(custom_sprite)
H.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
H.icon_override = 'icons/mob/custom_synthetic/custom_head.dmi'
H.lefthand_file = 'icons/mob/custom_synthetic/custom_lefthand.dmi'
H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
H.icon_state = "[icon_state]"
H.item_state = "[icon_state]_hand"
else
H.icon_state = "pai-[icon_state]"
H.item_state = "pai-[icon_state]"
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
@@ -281,7 +281,7 @@
if(!player) return
src.ckey = player.ckey
ckey = player.ckey
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(src)
@@ -47,4 +47,55 @@
if(M.a_intent == I_HELP)
get_scooped(M)
..()
..()
/mob/living/silicon/robot/drone/verb/customize()
set name = "Customize Chassis"
set desc = "Reconfigure your chassis into a customized version."
set category = "Drone"
if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var
var/file = file2text("config/custom_sprites.txt")
var/lines = splittext(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = splittext(line, ":")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2 || Entry[1] != "drone")
continue
if (Entry[2] == ckey) //Custom holograms
custom_sprite = 1 // option is given in hologram menu
if(!custom_sprite)
to_chat(src, "<span class='warning'>Error 404: Custom chassis not found. Revoking customization option.</span>")
else
icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
icon_state = "[ckey]-drone"
to_chat(src, "<span class='notice'>You reconfigure your chassis and improve the station through your new aesthetics.</span>")
verbs -= /mob/living/silicon/robot/drone/verb/customize
/mob/living/silicon/robot/drone/get_scooped(mob/living/carbon/grabber)
var/obj/item/weapon/holder/H = ..()
if(!istype(H))
return
if(resting)
resting = 0
if(custom_sprite)
H.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
H.icon_override = 'icons/mob/custom_synthetic/custom_head.dmi'
H.lefthand_file = 'icons/mob/custom_synthetic/custom_lefthand.dmi'
H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
H.icon_state = "[icon_state]"
H.item_state = "[icon_state]_hand"
else
H.icon_state = "drone"
H.item_state = "drone"
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
return H
+14 -18
View File
@@ -180,16 +180,15 @@ var/list/robot_verbs_default = list(
for(var/line in lines)
// split & clean up
var/list/Entry = splittext(line, ";")
var/list/Entry = splittext(line, ":")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
continue;
if(Entry.len < 2 || Entry[1] != "cyborg") //ignore incorrectly formatted entries or entries that aren't marked for cyborg
continue
if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
icon = 'icons/mob/custom-synthetic.dmi'
return 1
@@ -252,12 +251,10 @@ var/list/robot_verbs_default = list(
mmi = null
if(connected_ai)
connected_ai.connected_robots -= src
qdel(wires)
wires = null
qdel(module)
module = null
camera = null
cell = null
QDEL_NULL(wires)
QDEL_NULL(module)
QDEL_NULL(camera)
QDEL_NULL(cell)
return ..()
/mob/living/silicon/robot/proc/pick_module()
@@ -1252,15 +1249,14 @@ var/list/robot_verbs_default = list(
triesleft--
var/icontype
if(custom_sprite == 1)
icontype = "Custom"
triesleft = 0
else
lockcharge = 1 //Locks borg until it select an icon to avoid secborgs running around with a standard sprite
icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
lockcharge = 1 //Locks borg until it select an icon to avoid secborgs running around with a standard sprite
icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
if(icontype)
if(icontype == "Custom")
icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
else
icon = 'icons/mob/robots.dmi'
icon_state = module_sprites[icontype]
if(icontype == "Bro")
module.module_type = "Brobot"
@@ -35,8 +35,7 @@
for(var/module in modules)
qdel(module)
modules.Cut()
qdel(emag)
emag = null
QDEL_NULL(emag)
return ..()
/obj/item/weapon/robot_module/proc/fix_modules()
@@ -222,7 +221,7 @@
/obj/item/weapon/robot_module/security/New()
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
modules += new /obj/item/taperoll/police(src)
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
@@ -169,14 +169,11 @@
/mob/living/simple_animal/bot/Destroy()
if(paicard)
ejectpai()
qdel(Radio)
Radio = null
qdel(access_card)
access_card = null
QDEL_NULL(Radio)
QDEL_NULL(access_card)
if(radio_controller && bot_filter)
radio_controller.remove_object(bot_core, control_freq)
qdel(bot_core)
bot_core = null
QDEL_NULL(bot_core)
return ..()
/mob/living/simple_animal/bot/death(gibbed)
@@ -263,7 +260,7 @@
interact(H)
else
return ..()
/mob/living/simple_animal/bot/attack_ghost(mob/M)
interact(M)
@@ -65,12 +65,8 @@
/mob/living/simple_animal/bot/mulebot/Destroy()
unload(0)
if(wires)
qdel(wires)
wires = null
if(cell)
qdel(cell)
cell = null
QDEL_NULL(wires)
QDEL_NULL(cell)
return ..()
/mob/living/simple_animal/bot/mulebot/proc/set_suffix(suffix)
@@ -295,8 +295,7 @@
queen = new(src)
/obj/item/queen_bee/Destroy()
qdel(queen)
queen = null
QDEL_NULL(queen)
return ..()
@@ -108,7 +108,7 @@ Difficulty: Hard
..()
/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy()
qdel(spawned_rune)
QDEL_NULL(spawned_rune)
. = ..()
/mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L)
@@ -43,7 +43,7 @@
mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
/mob/living/simple_animal/hostile/megafauna/Destroy()
qdel(internal_gps)
QDEL_NULL(internal_gps)
. = ..()
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
@@ -77,7 +77,7 @@
OpenFire()
else
devour(L)
/mob/living/simple_animal/hostile/megafauna/onShuttleMove()
var/turf/oldloc = loc
. = ..()
@@ -96,6 +96,7 @@
if(collar)
collar.forceMove(loc)
collar = null
master_commander = null
simple_animal_list -= src
return ..()
@@ -303,7 +304,7 @@
/mob/living/simple_animal/proc/attacked_by(obj/item/I, mob/living/user) // Handled in _onclick/click.dm
return
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
@@ -662,15 +663,15 @@
. = ..()
/mob/living/simple_animal/can_equip(obj/item/I, slot, disable_warning = 0)
// . = ..() // Do not call parent. We do not want animals using their hand slots.
switch(slot)
if(slot_collar)
if(collar)
return 0
if(!can_collar)
return 0
if(!istype(I, /obj/item/clothing/accessory/petcollar))
return 0
// . = ..() // Do not call parent. We do not want animals using their hand slots.
switch(slot)
if(slot_collar)
if(collar)
return 0
if(!can_collar)
return 0
if(!istype(I, /obj/item/clothing/accessory/petcollar))
return 0
return 1
/mob/living/simple_animal/equip_to_slot(obj/item/W, slot)
@@ -692,13 +693,13 @@
name = collar.tagname
real_name = collar.tagname
regenerate_icons()
/mob/living/simple_animal/unEquip(obj/item/I, force)
. = ..()
if(!. || !I)
return
if(I == collar)
/mob/living/simple_animal/unEquip(obj/item/I, force)
. = ..()
if(!. || !I)
return
if(I == collar)
collar = null
regenerate_icons()
+1 -2
View File
@@ -444,8 +444,7 @@
if(assailant.client)
assailant.client.screen -= hud
assailant = null
qdel(hud)
hud = null
QDEL_NULL(hud)
return ..()
+2 -2
View File
@@ -41,8 +41,8 @@
else if(eyes) //If they're not, check to see if their eyes got one of them there colour matrices. Will be null if eyes are robotic/the mob isn't colourblind and they have no default colour matrix.
return eyes.get_colourmatrix()
/proc/isloyal(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
for(var/obj/item/weapon/implant/loyalty/L in A)
/proc/ismindshielded(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
for(var/obj/item/weapon/implant/mindshield/L in A)
if(L && L.implanted)
return 1
return 0
+201 -12
View File
@@ -559,10 +559,67 @@
/datum/sprite_accessory/hair/unathi
species_allowed = list("Unathi")
glasses_over = 1
icon = 'icons/mob/body_accessory.dmi'
/datum/sprite_accessory/hair/unathi/una_horns
name = "Unathi Horns"
icon_state = "soghun_horns"
/datum/sprite_accessory/hair/unathi/una_side_frills
icon = 'icons/mob/human_face.dmi'
name = "Unathi Side Frills"
icon_state = "unathi_sidefrills"
secondary_theme = "webbing"
/datum/sprite_accessory/hair/unathi/una_frills_dorsal
icon = 'icons/mob/human_face.dmi'
name = "Dorsal Frills"
icon_state = "unathi_dorsalfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/hair/unathi/simple
name = "Simple Horns"
icon_state = "horns_simple"
/datum/sprite_accessory/hair/unathi/short
name = "Short Horns"
icon_state = "horns_short"
/datum/sprite_accessory/hairy/unathi/curled
name = "Curled Horns"
icon_state = "horns_curled"
/datum/sprite_accessory/hair/unathi/ram
name = "Ram Horns"
icon_state = "horns_ram"
/datum/sprite_accessory/hair/unathi/double
name = "Double Horns"
icon_state = "horns_drac"
/datum/sprite_accessory/hair/unathi/lower
name = "Lower Horns"
icon_state = "horns_lower"
/datum/sprite_accessory/hair/unathi/big
name = "Big"
icon_state = "horns_big"
/datum/sprite_accessory/hair/unathi/ram2
name = "Ram alt."
icon_state = "horns_ram2"
/datum/sprite_accessory/hair/unathi/small
name = "Small"
icon_state = "horns_small"
/datum/sprite_accessory/hair/unathi/chin
name = "Chin"
icon_state = "horns_chin"
/datum/sprite_accessory/hair/unathi/adorns
name = "Adorns"
icon_state = "horns_adorns"
/datum/sprite_accessory/hair/unathi/spikes
name = "Spikes"
icon_state = "horns_spikes"
/datum/sprite_accessory/hair/skrell
species_allowed = list("Skrell")
@@ -747,6 +804,20 @@
icon_state = "braided"
secondary_theme = "beads"
/datum/sprite_accessory/hair/vulpkanin/vulp_hair_punkbraided
name = "Punk Braided"
icon_state = "punkbraided"
secondary_theme = "flare"
/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short2
name = "Short Alt."
icon_state = "short2"
glasses_over = 1
/datum/sprite_accessory/hair/vulpkanin/vulp_hair_rough
name = "Rough-Cropped Mane"
icon_state = "rough"
/datum/sprite_accessory/hair/vox
species_allowed = list("Vox")
glasses_over = 1
@@ -984,6 +1055,10 @@
name = "Tajara Goatee"
icon_state = "facial_goatee"
/datum/sprite_accessory/facial_hair/tajara/taj_goatee_faded
name = "Tajara Faded Goatee"
icon_state = "facial_goatee_faded"
/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
name = "Tajara Smallstache"
icon_state = "facial_smallstache"
@@ -1048,6 +1123,15 @@
name = "Swift"
icon_state = "vulp_facial_swift"
/datum/sprite_accessory/facial_hair/vulpkanin/vulp_elder
name = "Elder"
icon_state = "vulp_facial_elder"
secondary_theme = "chin"
/datum/sprite_accessory/facial_hair/vulpkanin/vulp_slash
name = "Slash"
icon_state = "vulp_facial_slash"
/datum/sprite_accessory/facial_hair/unathi
species_allowed = list("Unathi")
gender = NEUTER
@@ -1055,39 +1139,74 @@
/datum/sprite_accessory/facial_hair/unathi/una_spines_long
name = "Long Spines"
icon_state = "soghun_longspines"
icon_state = "unathi_longspines"
/datum/sprite_accessory/facial_hair/unathi/una_spines_short
name = "Short Spines"
icon_state = "soghun_shortspines"
icon_state = "unathi_shortspines"
/datum/sprite_accessory/facial_hair/unathi/una_frills_aquaspine
name = "Spiny Aquatic Frills"
icon_state = "unathi_dracfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
name = "Aquatic Frills"
icon_state = "soghun_aquaticfrills"
icon_state = "unathi_aquaticfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_long
name = "Long Frills"
icon_state = "soghun_longfrills"
icon_state = "unathi_longfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_short
name = "Short Frills"
icon_state = "soghun_shortfrills"
icon_state = "unathi_shortfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquaspine
name = "Spiny Aquatic Webbed Frills"
icon_state = "unathi_dracfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
name = "Aquatic Webbed Frills"
icon_state = "soghun_aquaticfrills"
icon_state = "unathi_aquaticfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
name = "Long Webbed Frills"
icon_state = "soghun_longfrills"
icon_state = "unathi_longfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
name = "Short Webbed Frills"
icon_state = "soghun_shortfrills"
icon_state = "unathi_shortfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_side_frills
name = "Side Frills"
icon_state = "unathi_sidefrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_dorsal
over_hair = null
name = "Dorsal Frills"
icon_state = "unathi_dorsalfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_chin_horns
name = "Chin Horns"
icon = 'icons/mob/body_accessory.dmi'
icon_state = "horns_chin"
/datum/sprite_accessory/facial_hair/unathi/una_horn_adorns
name = "Horn Adorns"
icon = 'icons/mob/body_accessory.dmi'
icon_state = "horns_adorns"
/datum/sprite_accessory/facial_hair/unathi/una_spikes
name = "Spikes"
icon = 'icons/mob/body_accessory.dmi'
icon_state = "horns_spikes"
//skin styles - WIP
//going to have to re-integrate this with surgery
//let the icon_state hold an icon preview for now
@@ -1649,6 +1768,38 @@
name = "Ram"
icon_state = "horns_ram"
/datum/sprite_accessory/head_accessory/unathi/double
name = "Double"
icon_state = "horns_drac"
/datum/sprite_accessory/head_accessory/unathi/lower
name = "Lower"
icon_state = "horns_lower"
/datum/sprite_accessory/head_accessory/unathi/big
name = "Big"
icon_state = "horns_big"
/datum/sprite_accessory/head_accessory/unathi/ram2
name = "Ram alt."
icon_state = "horns_ram2"
/datum/sprite_accessory/head_accessory/unathi/small
name = "Small"
icon_state = "horns_small"
/datum/sprite_accessory/head_accessory/unathi/chin
name = "Chin"
icon_state = "horns_chin"
/datum/sprite_accessory/head_accessory/unathi/adorns
name = "Adorns"
icon_state = "horns_adorns"
/datum/sprite_accessory/head_accessory/unathi/spikes
name = "Spikes"
icon_state = "horns_spikes"
/datum/sprite_accessory/head_accessory/tajara
species_allowed = list("Tajaran")
@@ -1729,6 +1880,20 @@
name = "Vulpkanin Nose"
icon_state = "markings_face_nose_vulp"
/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose2
name = "Vulpkanin Nose Alt."
icon_state = "markings_face_nose2_vulp"
/datum/sprite_accessory/head_accessory/vulpkanin/vulp_elder
icon = 'icons/mob/human_face.dmi'
name = "Elder"
icon_state = "vulp_facial_elder"
/datum/sprite_accessory/head_accessory/vulpkanin/vulp_slash
icon = 'icons/mob/human_face.dmi'
name = "Slash"
icon_state = "vulp_facial_slash"
/datum/sprite_accessory/head_accessory/ipc
species_allowed = list("Machine")
over_hair = 1
@@ -1749,11 +1914,31 @@
name = "Head Light"
icon_state = "light"
/datum/sprite_accessory/head_accessory/ipc/ipc_side_lights
name = "Side Lights"
icon_state = "sidelights"
/datum/sprite_accessory/head_accessory/ipc/ipc_side_cyber_head
name = "Cyber Pipes"
icon_state = "cyberhead"
/datum/sprite_accessory/head_accessory/ipc/ipc_side_antlers
name = "Antlers"
icon_state = "antlers"
/datum/sprite_accessory/head_accessory/ipc/ipc_side_drone_eyes
name = "Drone Eyes"
icon_state = "droneeyes"
/datum/sprite_accessory/head_accessory/ipc/ipc_crowned
name = "Crowned"
icon_state = "crowned"
/datum/sprite_accessory/head_accessory/kidan
icon = 'icons/mob/human_face.dmi'
species_allowed = list("Kidan")
over_hair = 1
do_colouration = 0
do_colouration = 1
/datum/sprite_accessory/head_accessory/kidan/perked_antennae
name = "Perked-up Antennae"
@@ -1956,6 +2141,10 @@
name = "Vulpkanin Nose"
icon_state = "markings_face_nose_vulp"
/datum/sprite_accessory/body_markings/head/vulpkanin/nose2_default_vulp
name = "Vulpkanin Nose Alt."
icon_state = "markings_face_nose2_vulp"
/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
name = "Vulpkanin Muzzle"
icon_state = "markings_face_full_vulp"
@@ -41,9 +41,7 @@ var/list/global_modular_computers = list()
global_modular_computers.Add(src)
/obj/machinery/modular_computer/Destroy()
if(cpu)
qdel(cpu)
cpu = null
QDEL_NULL(cpu)
return ..()
/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
@@ -23,7 +23,7 @@ var/global/file_uid = 0
if(holder.holder && holder.holder.active_program == src)
holder.holder.kill_program(forced = TRUE)
holder = null
..()
return ..()
// Returns independent copy of this file.
/datum/computer_file/proc/clone(rename = 0)
@@ -16,11 +16,10 @@
AH.register(src, /datum/computer_file/program/alarm_monitor/proc/update_icon)
/datum/computer_file/program/alarm_monitor/Destroy()
..()
for(var/datum/alarm_handler/AH in alarm_handlers)
AH.unregister(src)
qdel(alarm_handlers)
alarm_handlers = null
QDEL_NULL(alarm_handlers)
return ..()
/datum/computer_file/program/alarm_monitor/proc/update_icon()
for(var/datum/alarm_handler/AH in alarm_handlers)
@@ -11,9 +11,7 @@
var/locked = FALSE
/obj/item/weapon/computer_hardware/ai_slot/Destroy()
if(stored_card)
qdel(stored_card)
stored_card = null
QDEL_NULL(stored_card)
return ..()
@@ -14,9 +14,7 @@
..()
/obj/item/weapon/computer_hardware/battery/Destroy()
if(battery)
qdel(battery)
battery = null
QDEL_NULL(battery)
return ..()
/obj/item/weapon/computer_hardware/battery/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
@@ -11,12 +11,8 @@
var/obj/item/weapon/card/id/stored_card2 = null
/obj/item/weapon/computer_hardware/card_slot/Destroy()
if(stored_card)
qdel(stored_card)
stored_card = null
if(stored_card2)
qdel(stored_card2)
stored_card2 = null
QDEL_NULL(stored_card)
QDEL_NULL(stored_card2)
return ..()
/obj/item/weapon/computer_hardware/card_slot/GetAccess()
+1 -2
View File
@@ -74,6 +74,5 @@
spark_system.attach(src)
/obj/item/weapon/katana/energy/Destroy()
qdel(spark_system)
spark_system = null
QDEL_NULL(spark_system)
return ..()
+2 -4
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/bureaucracy.dmi'
usesound = 'sound/items/Deconstruct.ogg'
var/icon_base
var/obj/displayed
@@ -198,9 +198,7 @@
verbs |= /obj/structure/sign/picture_frame/proc/tilt
/obj/structure/sign/picture_frame/Destroy()
if(frame)
qdel(frame)
frame = null
QDEL_NULL(frame)
return ..()
/obj/structure/sign/picture_frame/update_icon()
+10 -1
View File
@@ -30,6 +30,7 @@
w_class = 2
burn_state = FLAMMABLE
burntime = 5
var/blueprints = 0 // Does this have the blueprints?
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/icon/tiny
@@ -151,6 +152,7 @@
var/pictures_max = 10
var/pictures_left = 10
var/on = 1
var/blueprints = 0
var/icon_on = "camera"
var/icon_off = "camera_off"
var/size = 3
@@ -253,6 +255,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
var/atom/A = sorted[i]
if(A)
var/icon/img = getFlatIcon(A)//build_composite_icon(A)
if(istype(A, /obj/item/areaeditor/blueprints))
blueprints = 1
// If what we got back is actually a picture, draw it.
if(istype(img, /icon))
@@ -351,7 +355,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
y_c--
x_c = x_c - size
var/datum/picture/P = createpicture(target, user, turfs, mobs, flag)
var/datum/picture/P = createpicture(target, user, turfs, mobs, flag, blueprints)
printpicture(user, P)
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
@@ -388,6 +392,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
Photo.loc = user.loc
if(!user.get_inactive_hand())
user.put_in_inactive_hand(Photo)
if(blueprints)
Photo.blueprints = 1
blueprints = 0
Photo.construct(P)
/obj/item/weapon/photo/proc/construct(var/datum/picture/P)
@@ -409,6 +417,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
p.name = name
p.desc = desc
p.scribble = scribble
p.blueprints = blueprints
return p
+2 -4
View File
@@ -440,7 +440,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
scanmode.scan_atom(A, user)
/obj/item/device/pda/proc/explode() //This needs tuning.
if(!detonate)
if(!detonate)
return
var/turf/T = get_turf(src.loc)
@@ -467,9 +467,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
for(var/A in programs)
qdel(A)
programs.Cut()
if(cartridge)
qdel(cartridge)
cartridge = null
QDEL_NULL(cartridge)
return ..()
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
+1 -3
View File
@@ -24,9 +24,7 @@
..()
/obj/item/weapon/cartridge/Destroy()
if(radio)
qdel(radio)
radio = null
QDEL_NULL(radio)
for(var/A in programs)
qdel(A)
programs.Cut()
+1
View File
@@ -78,6 +78,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
ch.users -= src
if(src in ch.invites)
ch.invites -= src
return ..()
/datum/data/pda/app/chatroom/start()
. = ..()
+3 -10
View File
@@ -90,7 +90,6 @@
var/update_overlay = -1
var/global/status_overlays = 0
var/updating_icon = 0
var/standard_max_charge
var/datum/wires/apc/wires = null
//var/debug = 0
var/global/list/status_overlays_lock
@@ -142,9 +141,6 @@
apcs += src
apcs = sortAtom(apcs)
wires = new(src)
var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new
standard_max_charge = tmp_cell.maxcharge
qdel(tmp_cell)
// offset 24 pixels in direction of dir
// this allows the APC to be embedded in a wall, yet still inside an area
@@ -178,11 +174,8 @@
area.power_change()
if(occupier)
malfvacate(1)
qdel(wires)
wires = null
if(cell)
qdel(cell) // qdel
cell = null
QDEL_NULL(wires)
QDEL_NULL(cell)
if(terminal)
disconnect_terminal()
area.apc -= src
@@ -201,7 +194,7 @@
if(cell_type)
src.cell = new/obj/item/weapon/stock_parts/cell(src)
cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively)
cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value)
cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
var/area/A = get_area(src)
+8 -8
View File
@@ -5,24 +5,25 @@
return 100.0*charge/maxcharge
// use power from a cell
/obj/item/weapon/stock_parts/cell/proc/use(var/amount)
/obj/item/weapon/stock_parts/cell/proc/use(amount)
if(rigged && amount > 0)
explode()
return 0
if(charge < amount) return 0
if(charge < amount)
return 0
charge = (charge - amount)
return 1
// recharge the cell
/obj/item/weapon/stock_parts/cell/proc/give(var/amount)
/obj/item/weapon/stock_parts/cell/proc/give(amount)
if(rigged && amount > 0)
explode()
return 0
if(maxcharge < amount) return 0
if(maxcharge < amount)
return 0
var/power_used = min(maxcharge-charge,amount)
if(crit_fail) return 0
if(crit_fail)
return 0
if(!prob(reliability))
minor_fault++
if(prob(minor_fault))
@@ -31,7 +32,6 @@
charge += power_used
return power_used
/obj/item/weapon/stock_parts/cell/examine(mob/user)
if(..(user, 1))
if(maxcharge <= 2500)
+1 -2
View File
@@ -52,8 +52,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/part/Destroy()
set_broken()
if(main_part)
qdel(main_part)
QDEL_NULL(main_part)
return ..()
//
@@ -30,8 +30,7 @@
/obj/machinery/particle_accelerator/control_box/Destroy()
if(active)
toggle_power()
qdel(wires)
wires = null
QDEL_NULL(wires)
return ..()
/obj/machinery/particle_accelerator/control_box/attack_ghost(user as mob)
@@ -72,9 +72,7 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
if(radio)
qdel(radio)
radio = null
QDEL_NULL(radio)
poi_list.Remove(src)
return ..()
+17 -15
View File
@@ -3,7 +3,7 @@
desc = "The part of the gun that makes the laser go pew"
caliber = "energy"
projectile_type = /obj/item/projectile/energy
var/e_cost = 1000 //The amount of energy a cell needs to expend to create this shot.
var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
fire_sound = 'sound/weapons/Laser.ogg'
@@ -13,10 +13,11 @@
/obj/item/ammo_casing/energy/lasergun
projectile_type = /obj/item/projectile/beam/laser
e_cost = 830
e_cost = 83
select_name = "kill"
/obj/item/ammo_casing/energy/laser/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
e_cost = 100
/obj/item/ammo_casing/energy/laser/practice
projectile_type = /obj/item/projectile/beam/practice
@@ -35,13 +36,13 @@
/obj/item/ammo_casing/energy/laser/pulse
projectile_type = /obj/item/projectile/beam/pulse
e_cost = 2000
e_cost = 200
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/scatter/pulse
projectile_type = /obj/item/projectile/beam/pulse
e_cost = 2000
e_cost = 200
select_name = "ANNIHILATE"
fire_sound = 'sound/weapons/pulse.ogg'
@@ -55,26 +56,27 @@
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
e_cost = 500
e_cost = 50
fire_sound = 'sound/weapons/laser3.ogg'
/obj/item/ammo_casing/energy/immolator
projectile_type = /obj/item/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
e_cost = 1250
e_cost = 125
/obj/item/ammo_casing/energy/electrode
projectile_type = /obj/item/projectile/energy/electrode
select_name = "stun"
fire_sound = 'sound/weapons/taser.ogg'
e_cost = 2000
e_cost = 200
delay = 15
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
e_cost = 1000
e_cost = 100
/obj/item/ammo_casing/energy/electrode/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
e_cost = 200
/obj/item/ammo_casing/energy/ion
projectile_type = /obj/item/projectile/ion
@@ -121,7 +123,7 @@
/obj/item/ammo_casing/energy/disabler
projectile_type = /obj/item/projectile/beam/disabler
select_name = "disable"
e_cost = 500
e_cost = 50
fire_sound = 'sound/weapons/taser2.ogg'
/obj/item/ammo_casing/energy/plasma
@@ -129,12 +131,12 @@
select_name = "plasma burst"
fire_sound = 'sound/weapons/plasma_cutter.ogg'
delay = 15
e_cost = 250
e_cost = 25
/obj/item/ammo_casing/energy/plasma/adv
projectile_type = /obj/item/projectile/plasma/adv
delay = 10
e_cost = 100
e_cost = 10
/obj/item/ammo_casing/energy/wormhole
projectile_type = /obj/item/projectile/beam/wormhole
@@ -153,7 +155,7 @@
/obj/item/ammo_casing/energy/bolt
projectile_type = /obj/item/projectile/energy/bolt
select_name = "bolt"
e_cost = 5000
e_cost = 500
fire_sound = 'sound/weapons/Genhit.ogg'
/obj/item/ammo_casing/energy/bolt/large
@@ -163,7 +165,7 @@
/obj/item/ammo_casing/energy/dart
projectile_type = /obj/item/projectile/energy/dart
fire_sound = 'sound/weapons/Genhit.ogg'
e_cost = 5000
e_cost = 500
select_name = "toxic dart"
/obj/item/ammo_casing/energy/instakill
@@ -187,7 +189,7 @@
/obj/item/ammo_casing/energy/shock_revolver
fire_sound = 'sound/magic/lightningbolt.ogg'
e_cost = 2000
e_cost = 200
select_name = "lightning beam"
projectile_type = /obj/item/projectile/energy/shock_revolver
@@ -210,7 +212,7 @@
/obj/item/ammo_casing/energy/teleport
projectile_type = /obj/item/projectile/energy/teleport
fire_sound = 'sound/weapons/wave.ogg'
e_cost = 1250
e_cost = 250
select_name = "teleport beam"
var/teleport_target
@@ -26,7 +26,7 @@
/obj/item/ammo_casing/magic/chaos
projectile_type = /obj/item/projectile/magic
/obj/item/ammo_casing/magic/spellblade
projectile_type = /obj/item/projectile/magic/spellblade
@@ -49,4 +49,4 @@
projectile_type = /obj/item/projectile/bullet/midbullet3
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
e_cost = 200
e_cost = 20
+4 -4
View File
@@ -34,7 +34,7 @@
if(selfcharge)
processing_objects.Add(src)
update_icon()
/obj/item/weapon/gun/energy/proc/update_ammo_types()
var/obj/item/ammo_casing/energy/shot
for(var/i = 1, i <= ammo_type.len, i++)
@@ -61,9 +61,9 @@
var/obj/item/ammo_casing/energy/E = ammo_type[select]
if(use_external_power)
var/obj/item/weapon/stock_parts/cell/external = get_external_power_supply()
if(!external || !external.use((E.e_cost)/10)) //Take power from the borg...
if(!external || !external.use(E.e_cost)) //Take power from the borg...
return //Note, uses /10 because of shitty mods to the cell system
power_supply.give(1000) //... to recharge the shot
power_supply.give(100) //... to recharge the shot
update_icon()
/obj/item/weapon/gun/energy/attack_self(mob/living/user as mob)
@@ -176,7 +176,7 @@
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
if(R.cell.use(shot.e_cost/10)) //Take power from the borg... //Divided by 10 because cells and charge costs are fucked.
if(R.cell.use(shot.e_cost)) //Take power from the borg...
power_supply.give(shot.e_cost) //... to recharge the shot
/obj/item/weapon/gun/energy/proc/get_external_power_supply()
@@ -94,7 +94,7 @@
empty()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
power_supply.use(5000)
power_supply.use(500)
update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
@@ -120,7 +120,7 @@
return
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
power_supply.give(5000)
power_supply.give(500)
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else if(isliving(loc))
@@ -144,7 +144,7 @@
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
select_name = "kinetic"
e_cost = 5000
e_cost = 500
fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
/obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
@@ -181,7 +181,7 @@
/obj/item/projectile/kinetic/pod
range = 4
/obj/item/projectile/kinetic/pod/regular
damage = 50
pressure_decrease = 0.5
@@ -39,8 +39,8 @@
/obj/item/weapon/gun/energy/gun/mini/New()
gun_light = new /obj/item/device/flashlight/seclite(src)
..()
power_supply.maxcharge = 6000
power_supply.charge = 6000
power_supply.maxcharge = 600
power_supply.charge = 600
/obj/item/weapon/gun/energy/gun/mini/update_icon()
..()
+17 -19
View File
@@ -157,11 +157,11 @@
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
var/obj/item/stack/sheet/S = A
S.use(1)
power_supply.give(10000)
power_supply.give(1000)
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
else if(istype(A, /obj/item/weapon/ore/plasma))
qdel(A)
power_supply.give(5000)
power_supply.give(500)
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
else
..()
@@ -308,12 +308,10 @@
desc = "A gun that changes the body temperature of its targets."
var/temperature = 300
var/target_temperature = 300
var/e_cost = 1000
origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/temp)
selfcharge = 1
cell_type = /obj/item/weapon/stock_parts/cell
var/powercost = ""
var/powercostcolor = ""
@@ -369,19 +367,19 @@
T.temp = temperature
switch(temperature)
if(0 to 100)
T.e_cost = 3000
T.e_cost = 300
powercost = "High"
if(100 to 250)
T.e_cost = 2000
T.e_cost = 200
powercost = "Medium"
if(251 to 300)
T.e_cost = 1000
T.e_cost = 100
powercost = "Low"
if(301 to 400)
T.e_cost = 2000
T.e_cost = 200
powercost = "Medium"
if(401 to 1000)
T.e_cost = 3000
T.e_cost = 300
powercost = "High"
switch(powercost)
if("High")
@@ -471,16 +469,16 @@
/obj/item/weapon/gun/energy/temperature/proc/update_charge()
var/charge = power_supply.charge
switch(charge)
if(9000 to INFINITY) overlays += "900"
if(8000 to 9000) overlays += "800"
if(7000 to 8000) overlays += "700"
if(6000 to 7000) overlays += "600"
if(5000 to 6000) overlays += "500"
if(4000 to 5000) overlays += "400"
if(3000 to 4000) overlays += "300"
if(2000 to 3000) overlays += "200"
if(1000 to 2002) overlays += "100"
if(-INFINITY to 1000) overlays += "0"
if(900 to INFINITY) overlays += "900"
if(800 to 900) overlays += "800"
if(700 to 800) overlays += "700"
if(600 to 700) overlays += "600"
if(500 to 600) overlays += "500"
if(400 to 500) overlays += "400"
if(300 to 400) overlays += "300"
if(200 to 300) overlays += "200"
if(100 to 202) overlays += "100"
if(-INFINITY to 100) overlays += "0"
/obj/item/weapon/gun/energy/mimicgun
name = "mimic gun"
@@ -5,23 +5,12 @@
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
cell_type = /obj/item/weapon/stock_parts/cell/crap
/obj/item/weapon/gun/energy/taser/mounted
name = "mounted taser gun"
selfcharge = 1
use_external_power = 1
/obj/item/weapon/gun/energy/taser/cyborg
name = "taser gun"
desc = "A small, low capacity gun used for non-lethal takedowns."
icon_state = "taser"
cell_type = /obj/item/weapon/stock_parts/cell/secborg
/obj/item/weapon/gun/energy/disabler/cyborg/newshot()
..()
robocharge()
/obj/item/weapon/gun/energy/shock_revolver
name = "tesla revolver"
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
@@ -6,7 +6,6 @@
icon_state = "telegun"
item_state = "ionrifle"
origin_tech = "combat=6;materials=7;powerstorage=5;bluespace=5;syndicate=4"
cell_type = /obj/item/weapon/stock_parts/cell/crap
ammo_type = list(/obj/item/ammo_casing/energy/teleport)
shaded_charge = 1
var/teleport_target = null
+1 -2
View File
@@ -36,8 +36,7 @@
notify_ammo_count(user)
/obj/item/weapon/gun/throw/Destroy()
qdel(to_launch)
to_launch = null
QDEL_NULL(to_launch)
for(var/atom/A in loaded_projectiles)
qdel(A)
loaded_projectiles = null
@@ -93,9 +93,7 @@
return
/obj/machinery/reagentgrinder/Destroy()
if(beaker)
qdel(beaker)
beaker = null
QDEL_NULL(beaker)
return ..()
/obj/machinery/reagentgrinder/ex_act(severity)
@@ -48,8 +48,7 @@
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
cube.Expand()
// Dehydrated carp
if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
+1 -3
View File
@@ -78,9 +78,7 @@
var/accepts_rig = 1
/obj/structure/reagent_dispensers/fueltank/Destroy()
if(rig)
qdel(rig)
rig = null
QDEL_NULL(rig)
return ..()
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
+10 -10
View File
@@ -500,7 +500,7 @@
var/hasmob = 0 //If it contains a mob
Destroy()
qdel(gas)
QDEL_NULL(gas)
active = 0
return ..()
@@ -1146,11 +1146,11 @@
update()
return
/obj/structure/disposalpipe/trunk/Destroy()
if(istype(linked, /obj/structure/disposaloutlet))
var/obj/structure/disposaloutlet/O = linked
O.expel()
O.expel(animation = 0)
else if(istype(linked, /obj/machinery/disposal))
var/obj/machinery/disposal/D = linked
if(D.trunk == src)
@@ -1207,7 +1207,7 @@
playsound(loc, W.usesound, 100, 1)
to_chat(user, "<span class='notice'>Slicing the disposal pipe.</span>")
if(do_after(user, 30 * W.toolspeed, target = src))
if(!W.isOn())
if(!W.isOn())
return
welded()
else
@@ -1290,12 +1290,13 @@
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
proc/expel(var/obj/structure/disposalholder/H)
proc/expel(var/obj/structure/disposalholder/H, animation = 1)
flick("outlet-open", src)
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
sleep(20) //wait until correct animation frame
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
if(animation)
flick("outlet-open", src)
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
sleep(20) //wait until correct animation frame
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
if(H)
for(var/atom/movable/AM in H)
@@ -1308,7 +1309,6 @@
H.vent_gas(src.loc)
qdel(H)
return
attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
+1 -3
View File
@@ -429,7 +429,5 @@
desc += " The package is not sealed."
/obj/item/shippingPackage/Destroy()
if(wrapped)
qdel(wrapped)
wrapped = null
QDEL_NULL(wrapped)
return ..()
@@ -608,6 +608,14 @@
build_path = /obj/item/weapon/rcd
category = list("hacked", "Construction")
/datum/design/rcl
name = "Rapid Cable Layer"
id = "rcl"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
build_path = /obj/item/weapon/twohanded/rcl
category = list("hacked", "Construction")
/datum/design/electropack
name = "Electropack"
id = "electropack"
@@ -190,7 +190,7 @@
materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200)
build_path = /obj/item/clothing/glasses/hud/hydroponic/night
category = list("Equipment")
/datum/design/handdrill
name = "Hand Drill"
desc = "A small electric hand drill with an interchangable screwdriver and bolt bit"
@@ -210,7 +210,7 @@
build_type = PROTOLATHE
materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_DIAMOND = 1000)
category = list("Equipment")
/datum/design/alienwrench
name = "Alien Wrench"
desc = "An advanced wrench obtained through Abductor technology."
+15 -15
View File
@@ -167,32 +167,32 @@
build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting
category = list("Exosuit Modules")
/datum/design/recitence_main
name = "Exosuit Module (\"Recitence\" Central Control module)"
desc = "Allows for the construction of a \"Recitence\" Central Control module."
id = "recitence_main"
/datum/design/reticence_main
name = "Exosuit Module (\"Reticence\" Central Control module)"
desc = "Allows for the construction of a \"Reticence\" Central Control module."
id = "reticence_main"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/recitence/main
build_path = /obj/item/weapon/circuitboard/mecha/reticence/main
category = list("Exosuit Modules")
/datum/design/recitence_peri
name = "Exosuit Module (\"Recitence\" Peripherals Control module)"
desc = "Allows for the construction of a \"Recitence\" Peripheral Control module."
id = "recitence_peri"
/datum/design/reticence_peri
name = "Exosuit Module (\"Reticence\" Peripherals Control module)"
desc = "Allows for the construction of a \"Reticence\" Peripheral Control module."
id = "reticence_peri"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/recitence/peripherals
build_path = /obj/item/weapon/circuitboard/mecha/reticence/peripherals
category = list("Exosuit Modules")
/datum/design/recitence_targ
name = "Exosuit Module (\"Recitence\" Weapons & Targeting Control module)"
desc = "Allows for the construction of a \"Recitence\" Weapons & Targeting Control module."
id = "recitence_targ"
/datum/design/reticence_targ
name = "Exosuit Module (\"Reticence\" Weapons & Targeting Control module)"
desc = "Allows for the construction of a \"Reticence\" Weapons & Targeting Control module."
id = "reticence_targ"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mecha/recitence/targeting
build_path = /obj/item/weapon/circuitboard/mecha/reticence/targeting
category = list("Exosuit Modules")
@@ -459,69 +459,69 @@
construction_time = 200
category = list("H.O.N.K")
//Recitence
/datum/design/recitence_chassis
name = "Exosuit Chassis (\"Recitence\")"
id = "recitence_chassis"
//Reticence
/datum/design/reticence_chassis
name = "Exosuit Chassis (\"Reticence\")"
id = "reticence_chassis"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/chassis/recitence
build_path = /obj/item/mecha_parts/chassis/reticence
materials = list(MAT_METAL=20000)
construction_time = 100
category = list("Recitence")
category = list("Reticence")
/datum/design/recitence_torso
name = "Exosuit Torso (\"Recitence\")"
id = "recitence_torso"
/datum/design/reticence_torso
name = "Exosuit Torso (\"Reticence\")"
id = "reticence_torso"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/recitence_torso
build_path = /obj/item/mecha_parts/part/reticence_torso
materials = list(MAT_METAL=20000,MAT_GLASS=10000,MAT_TRANQUILLITE=10000)
construction_time = 300
category = list("Recitence")
category = list("Reticence")
/datum/design/recitence_head
name = "Exosuit Head (\"Recitence\")"
id = "recitence_head"
/datum/design/reticence_head
name = "Exosuit Head (\"Reticence\")"
id = "reticence_head"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/recitence_head
build_path = /obj/item/mecha_parts/part/reticence_head
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_TRANQUILLITE=5000)
construction_time = 200
category = list("Recitence")
category = list("Reticence")
/datum/design/recitence_left_arm
name = "Exosuit Left Arm (\"Recitence\")"
id = "recitence_left_arm"
/datum/design/reticence_left_arm
name = "Exosuit Left Arm (\"Reticence\")"
id = "reticence_left_arm"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/recitence_left_arm
build_path = /obj/item/mecha_parts/part/reticence_left_arm
materials = list(MAT_METAL=15000,MAT_TRANQUILLITE=5000)
construction_time = 200
category = list("Recitence")
category = list("Reticence")
/datum/design/recitence_right_arm
name = "Exosuit Right Arm (\"Recitence\")"
id = "recitence_right_arm"
/datum/design/reticence_right_arm
name = "Exosuit Right Arm (\"Reticence\")"
id = "reticence_right_arm"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/recitence_right_arm
build_path = /obj/item/mecha_parts/part/reticence_right_arm
materials = list(MAT_METAL=15000,MAT_TRANQUILLITE=5000)
construction_time = 200
category = list("Recitence")
category = list("Reticence")
/datum/design/recitence_left_leg
name = "Exosuit Left Leg (\"Recitence\")"
id = "recitence_left_leg"
/datum/design/reticence_left_leg
name = "Exosuit Left Leg (\"Reticence\")"
id = "reticence_left_leg"
build_type = MECHFAB
build_path =/obj/item/mecha_parts/part/recitence_left_leg
build_path =/obj/item/mecha_parts/part/reticence_left_leg
materials = list(MAT_METAL=20000,MAT_TRANQUILLITE=5000)
construction_time = 200
category = list("Recitence")
category = list("Reticence")
/datum/design/recitence_right_leg
name = "Exosuit Right Leg (\"Recitence\")"
id = "recitence_right_leg"
/datum/design/reticence_right_leg
name = "Exosuit Right Leg (\"Reticence\")"
id = "reticence_right_leg"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/recitence_right_leg
build_path = /obj/item/mecha_parts/part/reticence_right_leg
materials = list(MAT_METAL=20000,MAT_TRANQUILLITE=5000)
construction_time = 200
category = list("Recitence")
category = list("Reticence")
//Phazon
/datum/design/phazon_chassis
+1 -2
View File
@@ -62,8 +62,7 @@ Note: Must be placed west/left of and R&D console to function.
reagents.my_atom = src
/obj/machinery/r_n_d/protolathe/Destroy()
qdel(materials)
materials = null
QDEL_NULL(materials)
return ..()
/obj/machinery/r_n_d/protolathe/RefreshParts()
@@ -77,11 +77,11 @@
else if(istype(O, /obj/item/weapon/storage/bag))
var/obj/item/weapon/storage/P = O
var/loaded = 0
for(var/obj/G in P.contents)
if(istype(G, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
loaded = 1
monkeys++
qdel(G)
for(var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/MC in P.contents)
loaded = 1
monkeys++
P.remove_from_storage(MC)
qdel(MC)
if(loaded)
to_chat(user, "<span class='notice'>You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.</span>")
return
+4
View File
@@ -19,6 +19,10 @@
dir = EAST
/obj/structure/spacepod_frame/Destroy()
QDEL_NULL(construct)
return ..()
/obj/structure/spacepod_frame/attackby(obj/item/W as obj, mob/user as mob, params)
if(!construct || !construct.action(W, user))
..()
+9 -17
View File
@@ -124,22 +124,14 @@
/obj/spacepod/Destroy()
if(equipment_system.cargo_system)
equipment_system.cargo_system.removed(null)
qdel(equipment_system)
equipment_system = null
qdel(cargo_hold)
cargo_hold = null
qdel(battery)
battery = null
qdel(cabin_air)
cabin_air = null
qdel(internal_tank)
internal_tank = null
qdel(pr_int_temp_processor)
pr_int_temp_processor = null
qdel(pr_give_air)
pr_give_air = null
qdel(ion_trail)
ion_trail = null
QDEL_NULL(equipment_system)
QDEL_NULL(cargo_hold)
QDEL_NULL(battery)
QDEL_NULL(cabin_air)
QDEL_NULL(internal_tank)
QDEL_NULL(pr_int_temp_processor)
QDEL_NULL(pr_give_air)
QDEL_NULL(ion_trail)
occupant_sanity_check()
if(pilot)
pilot.forceMove(get_turf(src))
@@ -275,7 +267,7 @@
cargo_hold.emp_act(severity)
if(battery && battery.charge > 0)
battery.use((battery.charge / 2) / severity)
battery.use((battery.charge/3)/(severity*2))
deal_damage(80 / severity)
if(empcounter < (40 / severity))
empcounter = 40 / severity
@@ -150,8 +150,7 @@
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/internal/brain/mmi_holder/Destroy()
if(stored_mmi)
qdel(stored_mmi)
QDEL_NULL(stored_mmi)
return ..()
/obj/item/organ/internal/brain/mmi_holder/insert(var/mob/living/target,special = 0)
+2 -4
View File
@@ -128,7 +128,7 @@
var/rand_y = 0
var/emagged = 0
var/teleporting = 0
var/chargecost = 1500
var/chargecost = 1000
/obj/item/weapon/rcs/New()
..()
@@ -140,9 +140,7 @@
to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.")
/obj/item/weapon/rcs/Destroy()
if(rcell)
qdel(rcell)
rcell = null
QDEL_NULL(rcell)
return ..()
/obj/item/weapon/rcs/attack_self(mob/user)