mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-29 15:08:34 +01:00
Merge branch 'master' into upstream-merge-5654
This commit is contained in:
@@ -250,4 +250,4 @@ var/global/list/image/splatter_cache=list()
|
||||
/obj/effect/decal/cleanable/mucus/mapped/New()
|
||||
..()
|
||||
virus2 |= new /datum/disease2/disease
|
||||
virus2.makerandom()
|
||||
virus2[1].makerandom()
|
||||
|
||||
@@ -99,3 +99,13 @@
|
||||
mouse_opacity = FALSE
|
||||
anchored = TRUE
|
||||
plane = ABOVE_PLANE
|
||||
|
||||
// Similar to the tesla ball but doesn't actually do anything and is purely visual.
|
||||
/obj/effect/overlay/energy_ball
|
||||
name = "energy ball"
|
||||
desc = "An energy ball."
|
||||
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
|
||||
icon_state = "energy_ball"
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
@@ -56,13 +56,15 @@
|
||||
|
||||
/obj/effect/spider/stickyweb
|
||||
icon_state = "stickyweb1"
|
||||
New()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
|
||||
/obj/effect/spider/stickyweb/initialize()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/giant_spider))
|
||||
if(istype(mover, /mob/living/simple_mob/animal/giant_spider))
|
||||
return 1
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(50))
|
||||
@@ -80,10 +82,12 @@
|
||||
var/spiders_min = 6
|
||||
var/spiders_max = 24
|
||||
var/spider_type = /obj/effect/spider/spiderling
|
||||
New()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
processing_objects |= src
|
||||
|
||||
/obj/effect/spider/eggcluster/initialize()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
processing_objects |= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/spider/eggcluster/New(var/location, var/atom/parent)
|
||||
get_light_and_color(parent)
|
||||
@@ -129,10 +133,10 @@
|
||||
var/amount_grown = -1
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
||||
var/travelling_in_vent = 0
|
||||
var/list/grow_as = list(/mob/living/simple_animal/hostile/giant_spider, /mob/living/simple_animal/hostile/giant_spider/nurse, /mob/living/simple_animal/hostile/giant_spider/hunter)
|
||||
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
|
||||
/obj/effect/spider/spiderling/frost
|
||||
grow_as = list(/mob/living/simple_animal/hostile/giant_spider/frost)
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
|
||||
pixel_x = rand(6,-6)
|
||||
|
||||
@@ -6,4 +6,12 @@
|
||||
|
||||
/obj/item/device/pda/pathfinder
|
||||
default_cartridge = /obj/item/weapon/cartridge/signal/science
|
||||
icon_state = "pda-lawyer-old"
|
||||
|
||||
/obj/item/device/pda/explorer
|
||||
default_cartridge = /obj/item/weapon/cartridge/signal/science
|
||||
icon_state = "pda-det"
|
||||
|
||||
/obj/item/device/pda/sar
|
||||
default_cartridge = /obj/item/weapon/cartridge/medical
|
||||
icon_state = "pda-h"
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
return 0
|
||||
|
||||
if(!user.IsAdvancedToolUser() && isanimal(user))
|
||||
var/mob/living/simple_animal/S = user
|
||||
var/mob/living/simple_mob/S = user
|
||||
if(!S.IsHumanoidToolUser(src))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
cell.charge = 0
|
||||
visible_message("<span class='warning'>\The [src] flickers before going dull.</span>")
|
||||
set_light(0)
|
||||
playsound(src.loc, 'sound/effects/sparks3.ogg', 10, 1, -3) //Small cue that your light went dull in your pocket.
|
||||
on = 0
|
||||
update_icon()
|
||||
|
||||
@@ -180,6 +181,7 @@
|
||||
user.put_in_hands(cell)
|
||||
cell = null
|
||||
user << "<span class='notice'>You remove the cell from the [src].</span>"
|
||||
playsound(src, 'sound/machines/button.ogg', 30, 1, 0)
|
||||
on = 0
|
||||
update_icon()
|
||||
return
|
||||
@@ -228,6 +230,7 @@
|
||||
W.loc = src
|
||||
cell = W
|
||||
user << "<span class='notice'>You install a cell in \the [src].</span>"
|
||||
playsound(src, 'sound/machines/button.ogg', 30, 1, 0)
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='notice'>\The [src] already has a cell.</span>"
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
outmsg = "<span class='info'>You missed the lens of [C] with [src].</span>"
|
||||
|
||||
//cats!
|
||||
for(var/mob/living/simple_animal/cat/C in viewers(1,targloc))
|
||||
for(var/mob/living/simple_mob/animal/passive/cat/C in viewers(1,targloc))
|
||||
if (!(C.stat || C.buckled))
|
||||
if(prob(50) && !(C.client))
|
||||
C.visible_message("<span class='warning'>[C] pounces on the light!</span>", "<span class='warning'>You pounce on the light!</span>")
|
||||
|
||||
@@ -18,20 +18,51 @@
|
||||
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
|
||||
|
||||
var/mode_index = 1
|
||||
var/toolmode = MULTITOOL_MODE_STANDARD
|
||||
var/list/modes = list(MULTITOOL_MODE_STANDARD, MULTITOOL_MODE_INTCIRCUITS)
|
||||
|
||||
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
|
||||
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
|
||||
var/obj/machinery/clonepod/connecting //same for cryopod linkage
|
||||
var/obj/machinery/connectable //Used to connect machinery.
|
||||
var/weakref_wiring //Used to store weak references for integrated circuitry. This is now the Omnitool.
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/device/multitool/attack_self(mob/user)
|
||||
var/clear = alert("Do you want to clear the buffers on the [src]?",, "Yes", "No",)
|
||||
if(clear == "Yes")
|
||||
buffer = null
|
||||
connecting = null
|
||||
connectable = null
|
||||
/obj/item/device/multitool/attack_self(mob/living/user)
|
||||
var/choice = alert("What do you want to do with \the [src]?","Multitool Menu", "Switch Mode", "Clear Buffers", "Cancel")
|
||||
switch(choice)
|
||||
if("Cancel")
|
||||
to_chat(user,"<span class='notice'>You lower \the [src].</span>")
|
||||
return
|
||||
if("Clear Buffers")
|
||||
to_chat(user,"<span class='notice'>You clear \the [src]'s memory.</span>")
|
||||
buffer = null
|
||||
connecting = null
|
||||
connectable = null
|
||||
weakref_wiring = null
|
||||
accepting_refs = 0
|
||||
if(toolmode == MULTITOOL_MODE_INTCIRCUITS)
|
||||
accepting_refs = 1
|
||||
if("Switch Mode")
|
||||
mode_switch(user)
|
||||
|
||||
update_icon()
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/device/multitool/proc/mode_switch(mob/living/user)
|
||||
if(++mode_index > modes.len) mode_index = 1
|
||||
|
||||
else
|
||||
..()
|
||||
mode_index++
|
||||
|
||||
toolmode = modes[mode_index]
|
||||
to_chat(user,"<span class='notice'>\The [src] is now set to [toolmode].</span>")
|
||||
|
||||
accepting_refs = (toolmode == MULTITOOL_MODE_INTCIRCUITS)
|
||||
|
||||
return
|
||||
|
||||
/obj/item/device/multitool/cyborg
|
||||
name = "multitool"
|
||||
@@ -44,4 +75,4 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "multitool"
|
||||
toolspeed = 0.1
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 5)
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 5)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
//Unlimited use, unlimited range jammer for admins. Turn it on, drop it somewhere, it works.
|
||||
/obj/item/device/radio_jammer/admin
|
||||
jam_range = 255
|
||||
tick_cost = 0
|
||||
@@ -1,4 +1,5 @@
|
||||
// Access check is of the type requires one. These have been carefully selected to avoid allowing the janitor to see channels he shouldn't
|
||||
//VOREStation Edit Start - Updating this for Virgo
|
||||
var/global/list/default_internal_channels = list(
|
||||
num2text(PUB_FREQ) = list(),
|
||||
num2text(AI_FREQ) = list(access_synth),
|
||||
@@ -10,16 +11,18 @@ var/global/list/default_internal_channels = list(
|
||||
num2text(MED_I_FREQ)=list(access_medical_equip),
|
||||
num2text(SEC_FREQ) = list(access_security),
|
||||
num2text(SEC_I_FREQ)=list(access_security),
|
||||
num2text(SCI_FREQ) = list(access_tox,access_robotics,access_xenobiology),
|
||||
num2text(SUP_FREQ) = list(access_cargo),
|
||||
num2text(SRV_FREQ) = list(access_janitor, access_hydroponics)
|
||||
num2text(SCI_FREQ) = list(access_tox, access_robotics, access_xenobiology, access_explorer),
|
||||
num2text(SUP_FREQ) = list(access_cargo, access_mining_station),
|
||||
num2text(SRV_FREQ) = list(access_janitor, access_library, access_hydroponics, access_bar, access_kitchen),
|
||||
num2text(EXP_FREQ) = list(access_explorer, access_pilot, access_rd)
|
||||
)
|
||||
|
||||
var/global/list/default_medbay_channels = list(
|
||||
num2text(PUB_FREQ) = list(),
|
||||
num2text(MED_FREQ) = list(access_medical_equip),
|
||||
num2text(MED_I_FREQ) = list(access_medical_equip)
|
||||
num2text(MED_FREQ) = list(),
|
||||
num2text(MED_I_FREQ) = list()
|
||||
)
|
||||
//VOREStation Edit End
|
||||
|
||||
/obj/item/device/radio
|
||||
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit
|
||||
@@ -480,6 +483,13 @@ var/global/list/default_medbay_channels = list(
|
||||
//THIS IS TEMPORARY. YEAH RIGHT
|
||||
if(!connection) return 0 //~Carn
|
||||
|
||||
//VOREStation Add Start
|
||||
if(bluespace_radio)
|
||||
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
|
||||
src, message, displayname, jobname, real_name, M.voice_name,
|
||||
0, signal.data["compression"], list(0), connection.frequency,verb,speaking)
|
||||
//VOREStation Add End
|
||||
|
||||
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
|
||||
src, message, displayname, jobname, real_name, M.voice_name,
|
||||
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
|
||||
@@ -518,7 +528,8 @@ var/global/list/default_medbay_channels = list(
|
||||
if(!(0 in level))
|
||||
var/turf/position = get_turf(src)
|
||||
if(!position || !(position.z in level))
|
||||
return -1
|
||||
if(!bluespace_radio) //VOREStation Edit
|
||||
return -1
|
||||
if(freq in ANTAG_FREQS)
|
||||
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
/obj/item/device/radio
|
||||
var/bluespace_radio = FALSE
|
||||
|
||||
/obj/item/device/radio/phone
|
||||
subspace_transmission = 1
|
||||
canhear_range = 0
|
||||
adhoc_fallback = TRUE
|
||||
|
||||
/obj/item/device/radio/emergency
|
||||
name = "Medbay Emergency Radio Link"
|
||||
icon_state = "med_walkietalkie"
|
||||
frequency = MED_I_FREQ
|
||||
subspace_transmission = 1
|
||||
adhoc_fallback = TRUE
|
||||
|
||||
/obj/item/device/radio/emergency/New()
|
||||
..()
|
||||
internal_channels = default_medbay_channels.Copy()
|
||||
|
||||
//Pathfinder's Subspace Radio
|
||||
/obj/item/device/subspaceradio
|
||||
name = "subspace radio"
|
||||
desc = "A powerful new radio recently gifted to Nanotrasen from KHI, this communications device has the ability to send and recieve transmissions from anywhere."
|
||||
icon = 'icons/vore/custom_items_vr.dmi'
|
||||
icon_state = "radiopack"
|
||||
item_state = "parachute"
|
||||
slot_flags = SLOT_BACK
|
||||
force = 5
|
||||
throwforce = 6
|
||||
preserve_item = 1
|
||||
w_class = ITEMSIZE_LARGE
|
||||
action_button_name = "Remove/Replace Handset"
|
||||
|
||||
var/obj/item/device/radio/subspacehandset/linked/handset
|
||||
|
||||
/obj/item/device/subspaceradio/New() //starts without a cell for rnd
|
||||
..()
|
||||
if(ispath(handset))
|
||||
handset = new handset(src, src)
|
||||
else
|
||||
handset = new(src, src)
|
||||
|
||||
/obj/item/device/subspaceradio/Destroy()
|
||||
. = ..()
|
||||
QDEL_NULL(handset)
|
||||
|
||||
/obj/item/device/subspaceradio/ui_action_click()
|
||||
toggle_handset()
|
||||
|
||||
/obj/item/device/subspaceradio/attack_hand(mob/user)
|
||||
if(loc == user)
|
||||
toggle_handset()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/device/subspaceradio/MouseDrop()
|
||||
if(ismob(loc))
|
||||
if(!CanMouseDrop(src))
|
||||
return
|
||||
var/mob/M = loc
|
||||
if(!M.unEquip(src))
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
M.put_in_any_hand_if_possible(src)
|
||||
|
||||
/obj/item/device/subspaceradio/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(W == handset)
|
||||
reattach_handset(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/subspaceradio/verb/toggle_handset()
|
||||
set name = "Toggle Handset"
|
||||
set category = "Object"
|
||||
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(!handset)
|
||||
to_chat(user, "<span class='warning'>The handset is missing!</span>")
|
||||
return
|
||||
|
||||
if(handset.loc != src)
|
||||
reattach_handset(user) //Remove from their hands and back onto the defib unit
|
||||
return
|
||||
|
||||
if(!slot_check())
|
||||
to_chat(user, "<span class='warning'>You need to equip [src] before taking out [handset].</span>")
|
||||
else
|
||||
if(!usr.put_in_hands(handset)) //Detach the handset into the user's hands
|
||||
to_chat(user, "<span class='warning'>You need a free hand to hold the handset!</span>")
|
||||
update_icon() //success
|
||||
|
||||
//checks that the base unit is in the correct slot to be used
|
||||
/obj/item/device/subspaceradio/proc/slot_check()
|
||||
var/mob/M = loc
|
||||
if(!istype(M))
|
||||
return 0 //not equipped
|
||||
|
||||
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
|
||||
return 1
|
||||
if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/device/subspaceradio/dropped(mob/user)
|
||||
..()
|
||||
reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit
|
||||
|
||||
/obj/item/device/subspaceradio/proc/reattach_handset(mob/user)
|
||||
if(!handset) return
|
||||
|
||||
if(ismob(handset.loc))
|
||||
var/mob/M = handset.loc
|
||||
if(M.drop_from_inventory(handset, src))
|
||||
to_chat(user, "<span class='notice'>\The [handset] snap back into the main unit.</span>")
|
||||
else
|
||||
handset.forceMove(src)
|
||||
|
||||
//Subspace Radio Handset
|
||||
/obj/item/device/radio/subspacehandset
|
||||
name = "subspace radio handset"
|
||||
desc = "A large walkie talkie attached to the subspace radio by a retractable cord. It sits comfortably on a slot in the radio when not in use."
|
||||
bluespace_radio = TRUE
|
||||
icon_state = "signaller"
|
||||
slot_flags = null
|
||||
w_class = ITEMSIZE_LARGE
|
||||
|
||||
/obj/item/device/radio/subspacehandset/linked
|
||||
var/obj/item/device/subspaceradio/base_unit
|
||||
|
||||
/obj/item/device/radio/subspacehandset/linked/New(newloc, obj/item/device/subspaceradio/radio)
|
||||
base_unit = radio
|
||||
..(newloc)
|
||||
|
||||
/obj/item/device/radio/subspacehandset/linked/Destroy()
|
||||
if(base_unit)
|
||||
//ensure the base unit's icon updates
|
||||
if(base_unit.handset == src)
|
||||
base_unit.handset = null
|
||||
base_unit = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/subspacehandset/linked/dropped(mob/user)
|
||||
..() //update twohanding
|
||||
if(base_unit)
|
||||
base_unit.reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit
|
||||
@@ -451,15 +451,15 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20)
|
||||
|
||||
/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
if(!isslime(M))
|
||||
to_chat(user, "<B>This device can only scan slimes!</B>")
|
||||
if(!istype(M, /mob/living/simple_mob/slime/xenobio))
|
||||
to_chat(user, "<B>This device can only scan lab-grown slimes!</B>")
|
||||
return
|
||||
var/mob/living/simple_animal/slime/S = M
|
||||
var/mob/living/simple_mob/slime/xenobio/S = M
|
||||
user.show_message("Slime scan results:<br>[S.slime_color] [S.is_adult ? "adult" : "baby"] slime<br>Health: [S.health]<br>Mutation Probability: [S.mutation_chance]")
|
||||
|
||||
var/list/mutations = list()
|
||||
for(var/potential_color in S.slime_mutation)
|
||||
var/mob/living/simple_animal/slime/slime = potential_color
|
||||
var/mob/living/simple_mob/slime/xenobio/slime = potential_color
|
||||
mutations.Add(initial(slime.slime_color))
|
||||
user.show_message("Potental to mutate into [english_list(mutations)] colors.<br>Extract potential: [S.cores]<br>Nutrition: [S.nutrition]/[S.get_max_nutrition()]")
|
||||
|
||||
@@ -469,12 +469,14 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
user.show_message("<span class='warning'>Warning: Subject is hungry.</span>")
|
||||
user.show_message("Electric change strength: [S.power_charge]")
|
||||
|
||||
if(S.resentment)
|
||||
user.show_message("<span class='warning'>Warning: Subject is harboring resentment.</span>")
|
||||
if(S.docile)
|
||||
if(S.has_AI())
|
||||
var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder
|
||||
if(AI.resentment)
|
||||
user.show_message("<span class='warning'>Warning: Subject is harboring resentment.</span>")
|
||||
if(AI.rabid)
|
||||
user.show_message("<span class='danger'>Subject is enraged and extremely dangerous!</span>")
|
||||
if(S.harmless)
|
||||
user.show_message("Subject has been pacified.")
|
||||
if(S.rabid)
|
||||
user.show_message("<span class='danger'>Subject is enraged and extremely dangerous!</span>")
|
||||
if(S.unity)
|
||||
user.show_message("Subject is friendly to other slime colors.")
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
matter = list("glass" = 200)
|
||||
flags = NOBLUDGEON
|
||||
var/list/accept_mobs = list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse)
|
||||
var/list/accept_mobs = list(/mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/mouse)
|
||||
var/contains = 0 // 0 = nothing, 1 = money, 2 = animal, 3 = spiderling
|
||||
|
||||
/obj/item/glass_jar/New()
|
||||
|
||||
@@ -47,14 +47,3 @@
|
||||
processing_objects -= src
|
||||
return ..()
|
||||
|
||||
|
||||
//Crashed Cargo Shuttle PoI
|
||||
|
||||
/obj/structure/largecrate/animal/crashedshuttle
|
||||
name = "SCP"
|
||||
|
||||
/obj/structure/largecrate/animal/crashedshuttle/initialize()
|
||||
starts_with = list(pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble, /obj/item/weapon/deadringer)) // Starts_with has to be a list
|
||||
name = pick("Spicy Crust Pizzeria", "Soap and Care Products", "Sally's Computer Parts", "Steve's Chocolate Pastries", "Smith & Christian's Plastics","Standard Containers & Packaging Co.", "Sanitary Chemical Purgation (LTD)")
|
||||
name += " delivery crate"
|
||||
return ..()
|
||||
|
||||
@@ -275,13 +275,6 @@
|
||||
add_flashes(W,user)
|
||||
else
|
||||
add_flashes(W,user)
|
||||
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
|
||||
to_chat(user, "<span class='notice'>You install some manipulators and modify the head, creating a functional spider-bot!</span>")
|
||||
new /mob/living/simple_animal/spiderbot(get_turf(loc))
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/robot_parts/head/proc/add_flashes(obj/item/W as obj, mob/user as mob) //Made into a seperate proc to avoid copypasta
|
||||
|
||||
@@ -14,9 +14,7 @@
|
||||
name = "glass"
|
||||
singular_name = "glass sheet"
|
||||
icon_state = "sheet-glass"
|
||||
var/created_window = /obj/structure/window/basic
|
||||
var/is_reinforced = 0
|
||||
var/list/construction_options = list("One Direction", "Full Window")
|
||||
default_type = "glass"
|
||||
|
||||
/obj/item/stack/material/glass/attack_self(mob/user as mob)
|
||||
@@ -52,75 +50,7 @@
|
||||
if (!G && replace)
|
||||
user.put_in_hands(RG)
|
||||
|
||||
/obj/item/stack/material/glass/proc/construct_window(mob/user as mob)
|
||||
if(!user || !src) return 0
|
||||
if(!istype(user.loc,/turf)) return 0
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return 0
|
||||
var/title = "Sheet-[name]"
|
||||
title += " ([src.get_amount()] sheet\s left)"
|
||||
switch(input(title, "What would you like to construct?") as null|anything in construction_options)
|
||||
if("One Direction")
|
||||
if(!src) return 1
|
||||
if(src.loc != user) return 1
|
||||
|
||||
var/list/directions = new/list(cardinal)
|
||||
var/i = 0
|
||||
for (var/obj/structure/window/win in user.loc)
|
||||
i++
|
||||
if(i >= 4)
|
||||
user << "<span class='warning'>There are too many windows in this location.</span>"
|
||||
return 1
|
||||
directions-=win.dir
|
||||
if(!(win.dir in cardinal))
|
||||
user << "<span class='warning'>Can't let you do that.</span>"
|
||||
return 1
|
||||
|
||||
//Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc.
|
||||
var/dir_to_set = 2
|
||||
for(var/direction in list( user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) ))
|
||||
var/found = 0
|
||||
for(var/obj/structure/window/WT in user.loc)
|
||||
if(WT.dir == direction)
|
||||
found = 1
|
||||
if(!found)
|
||||
dir_to_set = direction
|
||||
break
|
||||
new created_window( user.loc, dir_to_set, 1 )
|
||||
src.use(1)
|
||||
if("Full Window")
|
||||
if(!src) return 1
|
||||
if(src.loc != user) return 1
|
||||
if(src.get_amount() < 4)
|
||||
user << "<span class='warning'>You need more glass to do that.</span>"
|
||||
return 1
|
||||
if(locate(/obj/structure/window) in user.loc)
|
||||
user << "<span class='warning'>There is a window in the way.</span>"
|
||||
return 1
|
||||
new created_window( user.loc, SOUTHWEST, 1 )
|
||||
src.use(4)
|
||||
if("Windoor")
|
||||
if(!is_reinforced) return 1
|
||||
|
||||
|
||||
if(!src || src.loc != user) return 1
|
||||
|
||||
if(isturf(user.loc) && locate(/obj/structure/windoor_assembly/, user.loc))
|
||||
user << "<span class='warning'>There is already a windoor assembly in that location.</span>"
|
||||
return 1
|
||||
|
||||
if(isturf(user.loc) && locate(/obj/machinery/door/window/, user.loc))
|
||||
user << "<span class='warning'>There is already a windoor in that location.</span>"
|
||||
return 1
|
||||
|
||||
if(src.get_amount() < 5)
|
||||
user << "<span class='warning'>You need more glass to do that.</span>"
|
||||
return 1
|
||||
|
||||
new /obj/structure/windoor_assembly(user.loc, user.dir, 1)
|
||||
src.use(5)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
/*
|
||||
@@ -131,9 +61,7 @@
|
||||
singular_name = "reinforced glass sheet"
|
||||
icon_state = "sheet-rglass"
|
||||
default_type = "reinforced glass"
|
||||
created_window = /obj/structure/window/reinforced
|
||||
is_reinforced = 1
|
||||
construction_options = list("One Direction", "Full Window", "Windoor")
|
||||
|
||||
/*
|
||||
* Phoron Glass sheets
|
||||
@@ -142,7 +70,6 @@
|
||||
name = "phoron glass"
|
||||
singular_name = "phoron glass sheet"
|
||||
icon_state = "sheet-phoronglass"
|
||||
created_window = /obj/structure/window/phoronbasic
|
||||
default_type = "phoron glass"
|
||||
|
||||
/obj/item/stack/material/glass/phoronglass/attackby(obj/item/W, mob/user)
|
||||
@@ -170,5 +97,4 @@
|
||||
singular_name = "reinforced phoron glass sheet"
|
||||
icon_state = "sheet-phoronrglass"
|
||||
default_type = "reinforced phoron glass"
|
||||
created_window = /obj/structure/window/phoronreinforced
|
||||
is_reinforced = 1
|
||||
|
||||
Executable → Regular
+1
-1
@@ -23,7 +23,7 @@ AI MODULES
|
||||
|
||||
/obj/item/weapon/aiModule/proc/install(var/atom/movable/AM, var/mob/living/user)
|
||||
if(!user.IsAdvancedToolUser() && isanimal(user))
|
||||
var/mob/living/simple_animal/S = user
|
||||
var/mob/living/simple_mob/S = user
|
||||
if(!S.IsHumanoidToolUser(src))
|
||||
return 0
|
||||
|
||||
|
||||
@@ -7,55 +7,82 @@ RSF
|
||||
/obj/item/weapon/rsf
|
||||
name = "\improper Rapid-Service-Fabricator"
|
||||
desc = "A device used to rapidly deploy service items."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
description_info = "Control Clicking on the device will allow you to choose the glass it dispenses when in the proper mode."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "rcd"
|
||||
opacity = 0
|
||||
density = 0
|
||||
anchored = 0.0
|
||||
var/stored_matter = 30
|
||||
var/mode = 1
|
||||
var/obj/item/weapon/reagent_containers/glasstype = /obj/item/weapon/reagent_containers/food/drinks/metaglass
|
||||
|
||||
var/list/container_types = list(
|
||||
"metamorphic glass" = /obj/item/weapon/reagent_containers/food/drinks/metaglass,
|
||||
"half-pint glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/square,
|
||||
"rocks glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks,
|
||||
"milkshake glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/shake,
|
||||
"cocktail glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail,
|
||||
"shot glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/shot,
|
||||
"pint glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/pint,
|
||||
"mug" = /obj/item/weapon/reagent_containers/food/drinks/glass2/mug,
|
||||
"wine glass" = /obj/item/weapon/reagent_containers/food/drinks/glass2/wine,
|
||||
"condiment bottle" = /obj/item/weapon/reagent_containers/food/condiment
|
||||
)
|
||||
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
/obj/item/weapon/rsf/examine(mob/user)
|
||||
if(..(user, 0))
|
||||
user << "It currently holds [stored_matter]/30 fabrication-units."
|
||||
to_chat(user,"<span class='notice'>It currently holds [stored_matter]/30 fabrication-units.</span>")
|
||||
|
||||
/obj/item/weapon/rsf/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if (istype(W, /obj/item/weapon/rcd_ammo))
|
||||
|
||||
if ((stored_matter + 10) > 30)
|
||||
user << "The RSF can't hold any more matter."
|
||||
to_chat(user, "<span class='warning'>The RSF can't hold any more matter.</span>")
|
||||
return
|
||||
|
||||
qdel(W)
|
||||
|
||||
stored_matter += 10
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
|
||||
user << "The RSF now holds [stored_matter]/30 fabrication-units."
|
||||
to_chat(user,"<span class='notice'>The RSF now holds [stored_matter]/30 fabrication-units.</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/rsf/CtrlClick(mob/living/user)
|
||||
if(!Adjacent(user) || !istype(user))
|
||||
to_chat(user,"<span class='notice'>You are too far away.</span>")
|
||||
return
|
||||
var/glass_choice = input(user, "Please choose which type of glass you would like to produce.") as null|anything in container_types
|
||||
|
||||
if(glass_choice)
|
||||
glasstype = container_types[glass_choice]
|
||||
else
|
||||
glasstype = /obj/item/weapon/reagent_containers/food/drinks/metaglass
|
||||
|
||||
/obj/item/weapon/rsf/attack_self(mob/user as mob)
|
||||
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
|
||||
if (mode == 1)
|
||||
mode = 2
|
||||
user << "Changed dispensing mode to 'Drinking Glass:Pint'"
|
||||
to_chat(user,"<span class='notice'>Changed dispensing mode to 'Container'.</span>")
|
||||
return
|
||||
if (mode == 2)
|
||||
mode = 3
|
||||
user << "Changed dispensing mode to 'Paper'"
|
||||
to_chat(user,"<span class='notice'>Changed dispensing mode to 'Paper'</span>")
|
||||
return
|
||||
if (mode == 3)
|
||||
mode = 4
|
||||
user << "Changed dispensing mode to 'Pen'"
|
||||
to_chat(user,"<span class='notice'>Changed dispensing mode to 'Pen'</span>")
|
||||
return
|
||||
if (mode == 4)
|
||||
mode = 5
|
||||
user << "Changed dispensing mode to 'Dice Pack'"
|
||||
to_chat(user,"<span class='notice'>Changed dispensing mode to 'Dice Pack'</span>")
|
||||
return
|
||||
if (mode == 5)
|
||||
mode = 1
|
||||
user << "Changed dispensing mode to 'Cigarette'"
|
||||
to_chat(user,"<span class='notice'>Changed dispensing mode to 'Cigarette'</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/rsf/afterattack(atom/A, mob/user as mob, proximity)
|
||||
@@ -82,7 +109,7 @@ RSF
|
||||
product = new /obj/item/clothing/mask/smokable/cigarette()
|
||||
used_energy = 10
|
||||
if(2)
|
||||
product = new /obj/item/weapon/reagent_containers/food/drinks/glass2/pint()
|
||||
product = new glasstype()
|
||||
used_energy = 50
|
||||
if(3)
|
||||
product = new /obj/item/weapon/paper()
|
||||
@@ -94,7 +121,7 @@ RSF
|
||||
product = new /obj/item/weapon/storage/pill_bottle/dice()
|
||||
used_energy = 200
|
||||
|
||||
user << "Dispensing [product ? product : "product"]..."
|
||||
to_chat(user,"<span class='notice'>Dispensing [product ? product : "product"]...</span>")
|
||||
product.loc = get_turf(A)
|
||||
|
||||
if(isrobot(user))
|
||||
@@ -103,4 +130,4 @@ RSF
|
||||
R.cell.use(used_energy)
|
||||
else
|
||||
stored_matter--
|
||||
user << "The RSF now holds [stored_matter]/30 fabrication-units."
|
||||
to_chat(user,"<span class='notice'>The RSF now holds [stored_matter]/30 fabrication-units.</span>")
|
||||
|
||||
@@ -31,19 +31,25 @@
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks
|
||||
name = "manhack delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/hostile/viscerator
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator
|
||||
deliveryamt = 5
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/mercenary
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator/mercenary
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/raider
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator/raider
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/spesscarp
|
||||
name = "carp delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/hostile/carp
|
||||
spawner_type = /mob/living/simple_mob/animal/space/carp
|
||||
deliveryamt = 5
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/spider
|
||||
name = "spider delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/hostile/giant_spider/hunter
|
||||
spawner_type = /mob/living/simple_mob/animal/giant_spider/hunter
|
||||
deliveryamt = 3
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
|
||||
|
||||
|
||||
@@ -336,4 +336,4 @@ var/last_chew = 0
|
||||
target.m_intent = "walk"
|
||||
if(target.hud_used && user.hud_used.move_intent)
|
||||
target.hud_used.move_intent.icon_state = "walking"
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -39,3 +39,101 @@
|
||||
source.mind.store_memory("A implant can be activated by using the smile emote, <B>say *smile</B> to attempt to activate.", 0, 0)
|
||||
to_chat(source,"The implanted language implant can be activated by using the smile emote, <B>say *smile</B> to attempt to activate.")
|
||||
return 1
|
||||
|
||||
//////////////////////////////
|
||||
// Size Control Implant
|
||||
//////////////////////////////
|
||||
/obj/item/weapon/implant/sizecontrol
|
||||
name = "size control implant"
|
||||
desc = "Implant which allows to control host size via voice commands."
|
||||
icon_state = "implant_evil"
|
||||
var/owner
|
||||
var/active = TRUE
|
||||
|
||||
/obj/item/weapon/implant/sizecontrol/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b>L3-WD Size Controlling Implant<BR>
|
||||
<b>Life:</b>1-2 weeks after implanting<BR>
|
||||
<HR>
|
||||
<b>Function:</b> Resizes the host whenever specific verbal command is received<BR>"}
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/implant/sizecontrol/hear_talk(mob/M, msg)
|
||||
if(M == imp_in)
|
||||
return
|
||||
if(owner)
|
||||
if(M != owner)
|
||||
return
|
||||
if(findtext(msg,"ignore"))
|
||||
return
|
||||
var/list/replacechars = list("'" = "",">" = "","<" = "","(" = "",")" = "", "~" = "")
|
||||
msg = replace_characters(msg, replacechars)
|
||||
hear(msg)
|
||||
return
|
||||
|
||||
/obj/item/weapon/implant/sizecontrol/see_emote(mob/living/M, message, m_type)
|
||||
if(M == imp_in)
|
||||
return
|
||||
if(owner)
|
||||
if(M != owner)
|
||||
return
|
||||
var/list/replacechars = list("'" = "",">" = "","<" = "","(" = "",")" = "", "~" = "")
|
||||
message = replace_characters(message, replacechars)
|
||||
var/static/regex/say_in_me = new/regex("(")(.*?)(&#)", "g")
|
||||
while(say_in_me.Find(message))
|
||||
if(findtext(say_in_me.match,"ignore"))
|
||||
return
|
||||
hear(say_in_me.group[2])
|
||||
|
||||
|
||||
/obj/item/weapon/implant/sizecontrol/hear(var/msg)
|
||||
if (malfunction)
|
||||
return
|
||||
|
||||
if(istype(imp_in, /mob/living))
|
||||
var/mob/living/H = imp_in
|
||||
if(findtext(msg,"implant-toggle"))
|
||||
active = !active
|
||||
if(active)
|
||||
if(findtext(msg,"grow"))
|
||||
H.resize(min(H.size_multiplier*1.5, 2))
|
||||
else if(findtext(msg,"shrink"))
|
||||
H.resize(max(H.size_multiplier*0.5, 0.25))
|
||||
else if(findtext(msg, "resize"))
|
||||
var/static/regex/size_mult = new/regex("\\d+")
|
||||
if(size_mult.Find(msg))
|
||||
var/resizing_value = text2num(size_mult.match)
|
||||
if(findtext(msg, "centimeter")) //Because metric system rules
|
||||
H.resize(Clamp(resizing_value/170 , 0.25, 2)) //170 cm is average crewmember, I think
|
||||
else
|
||||
H.resize(Clamp(resizing_value , 0.25, 2))
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/implant/sizecontrol/post_implant(mob/source, mob/living/user = usr)
|
||||
if(source != user)
|
||||
owner = user
|
||||
|
||||
|
||||
/obj/item/weapon/implant/sizecontrol/emp_act(severity)
|
||||
if(istype(imp_in, /mob/living))
|
||||
var/newsize = pick(RESIZE_HUGE,RESIZE_BIG,RESIZE_NORMAL,RESIZE_SMALL,RESIZE_TINY,RESIZE_A_HUGEBIG,RESIZE_A_BIGNORMAL,RESIZE_A_NORMALSMALL,RESIZE_A_SMALLTINY)
|
||||
var/mob/living/H = imp_in
|
||||
H.resize(newsize)
|
||||
|
||||
/obj/item/weapon/implanter/sizecontrol
|
||||
name = "size control implant"
|
||||
desc = "Implant which allows to control host size via voice commands."
|
||||
description_info = {"Only accessable by those who implanted the victim. Self-implanting allows everyone to change host size. The following special commands are available:
|
||||
'Shrink' - host size decreases.
|
||||
'Grow' - host size increases.
|
||||
'Resize (NUMBER)' or 'Resize (NUMBER) centimeter(s)' - for accurate size control.
|
||||
'Ignore' - keywords in the speech won't have any effect.
|
||||
'Implant-toggle' - toggles implant."}
|
||||
|
||||
/obj/item/weapon/implanter/sizecontrol/New()
|
||||
src.imp = new /obj/item/weapon/implant/sizecontrol( src )
|
||||
..()
|
||||
update()
|
||||
return
|
||||
@@ -79,10 +79,9 @@
|
||||
var/obj/item/weapon/grab/grab = G
|
||||
if(!ismob(grab.affecting))
|
||||
return
|
||||
for(var/mob/living/simple_animal/slime/M in range(1,grab.affecting))
|
||||
if(M.victim == grab.affecting)
|
||||
usr << "[grab.affecting.name] will not fit into the [src.name] because they have a slime latched onto their head."
|
||||
return
|
||||
if(grab.affecting.has_buckled_mobs())
|
||||
to_chat(user, span("warning", "\The [grab.affecting] has other entities attached to them. Remove them first."))
|
||||
return
|
||||
var/mob/M = grab.affecting
|
||||
if(put_mob(M))
|
||||
qdel(G)
|
||||
|
||||
@@ -82,10 +82,11 @@
|
||||
|
||||
|
||||
var/obj/item/weapon/implant/reagent_generator/rimplant
|
||||
for(var/I in src.contents)
|
||||
if(istype(I, /obj/item/weapon/implant/reagent_generator))
|
||||
rimplant = I
|
||||
break
|
||||
for(var/obj/item/organ/external/E in organs)
|
||||
for(var/obj/item/weapon/implant/I in E.implants)
|
||||
if(istype(I, /obj/item/weapon/implant/reagent_generator))
|
||||
rimplant = I
|
||||
break
|
||||
if(rimplant)
|
||||
if(container.reagents.total_volume < container.volume)
|
||||
var/container_name = container.name
|
||||
|
||||
@@ -233,11 +233,10 @@
|
||||
playsound(get_turf(target), 'sound/weapons/blade1.ogg', 100, 1)
|
||||
|
||||
// Make lesser robots really mad at us.
|
||||
if(istype(target, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/SA = target
|
||||
if(SA.intelligence_level == SA_ROBOTIC)
|
||||
SA.taunt(user)
|
||||
SA.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
|
||||
if(target.mob_class & MOB_CLASS_SYNTHETIC)
|
||||
if(target.has_AI())
|
||||
target.taunt(user)
|
||||
target.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
|
||||
|
||||
/*
|
||||
*Energy Blade
|
||||
|
||||
@@ -292,7 +292,7 @@ var/list/tape_roll_applications = list()
|
||||
add_fingerprint(M)
|
||||
if (!allowed(M)) //only select few learn art of not crumpling the tape
|
||||
M << "<span class='warning'>You are not supposed to go past [src]...</span>"
|
||||
if(M.a_intent == I_HELP && !(istype(M, /mob/living/simple_animal)))
|
||||
if(M.a_intent == I_HELP && !(istype(M, /mob/living/simple_mob)))
|
||||
return 0
|
||||
crumple()
|
||||
return ..(mover)
|
||||
|
||||
@@ -269,9 +269,8 @@
|
||||
|
||||
/obj/item/weapon/melee/baton/shocker/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
..(target, user, hit_zone)
|
||||
if(istype(target, /mob/living/simple_animal) && status)
|
||||
var/mob/living/simple_animal/SA = target
|
||||
SA.taunt(user)
|
||||
if(status && target.has_AI())
|
||||
target.taunt(user)
|
||||
|
||||
// Borg version, for the lost module.
|
||||
/obj/item/weapon/melee/baton/shocker/robot
|
||||
|
||||
@@ -122,4 +122,4 @@
|
||||
counterpart.forceMove(get_turf(src))
|
||||
src.forceMove(counterpart)
|
||||
user.put_in_active_hand(counterpart)
|
||||
to_chat(user, "<span class='notice'>You attach the bolt driver bit to [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You attach the bolt driver bit to [src].</span>")
|
||||
|
||||
@@ -123,45 +123,10 @@
|
||||
remove_fuel(1)
|
||||
if(get_fuel() < 1)
|
||||
setWelding(0)
|
||||
//I'm not sure what this does. I assume it has to do with starting fires...
|
||||
//...but it doesnt check to see if the welder is on or not.
|
||||
var/turf/location = src.loc
|
||||
if(istype(location, /mob/living))
|
||||
var/mob/living/M = location
|
||||
if(M.item_is_in_hands(src))
|
||||
location = get_turf(M)
|
||||
if (istype(location, /turf))
|
||||
location.hotspot_expose(700, 5)
|
||||
|
||||
/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1)
|
||||
if(!welding && max_fuel)
|
||||
O.reagents.trans_to_obj(src, max_fuel)
|
||||
to_chat(user, "<span class='notice'>Welder refueled</span>")
|
||||
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
else if(!welding)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't use fuel.</span>")
|
||||
return
|
||||
else
|
||||
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
|
||||
to_chat(user, "<span class='danger'>You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.</span>")
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = O
|
||||
tank.explode()
|
||||
return
|
||||
if (src.welding)
|
||||
remove_fuel(1)
|
||||
var/turf/location = get_turf(user)
|
||||
if(isliving(O))
|
||||
var/mob/living/L = O
|
||||
L.IgniteMob()
|
||||
if (istype(location, /turf))
|
||||
location.hotspot_expose(700, 50, 1)
|
||||
|
||||
/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
|
||||
setWelding(!welding, usr)
|
||||
return
|
||||
|
||||
//Returns the amount of fuel in the welder
|
||||
/obj/item/weapon/weldingtool/proc/get_fuel()
|
||||
@@ -601,4 +566,5 @@
|
||||
/obj/item/weapon/weldingtool/electric/mounted/cyborg
|
||||
toolspeed = 0.5
|
||||
|
||||
|
||||
#undef WELDER_FUEL_BURN_INTERVAL
|
||||
@@ -68,4 +68,4 @@
|
||||
counterpart.forceMove(get_turf(src))
|
||||
src.forceMove(counterpart)
|
||||
user.put_in_active_hand(counterpart)
|
||||
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
var/spawn_delay = 10 MINUTES
|
||||
|
||||
var/list/spawn_types = list(
|
||||
/mob/living/simple_animal/corgi = 100,
|
||||
/mob/living/simple_animal/cat = 25
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi = 100,
|
||||
/mob/living/simple_mob/animal/passive/cat = 25
|
||||
)
|
||||
|
||||
var/total_spawns = -1 //Total mob spawns, over all time, -1 for no limit
|
||||
@@ -129,15 +129,14 @@ It also makes it so a ghost wont know where all the goodies/mobs are.
|
||||
//////////////
|
||||
// Spawners //
|
||||
/////////////
|
||||
|
||||
/obj/structure/mob_spawner/scanner/corgi
|
||||
name = "Corgi Lazy Spawner"
|
||||
desc = "This is a proof of concept, not sure why you would use this one"
|
||||
spawn_delay = 3 MINUTES
|
||||
mob_faction = "Corgi"
|
||||
spawn_types = list(
|
||||
/mob/living/simple_animal/corgi = 75,
|
||||
/mob/living/simple_animal/corgi/puppy = 50
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi = 75,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/puppy = 50
|
||||
)
|
||||
|
||||
simultaneous_spawns = 5
|
||||
@@ -157,10 +156,10 @@ It also makes it so a ghost wont know where all the goodies/mobs are.
|
||||
anchored = 1
|
||||
invisibility = 101
|
||||
spawn_types = list(
|
||||
/mob/living/simple_animal/retaliate/gaslamp = 20,
|
||||
/mob/living/simple_animal/otie/feral = 10,
|
||||
/mob/living/simple_animal/hostile/dino/virgo3b = 5,
|
||||
/mob/living/simple_animal/hostile/dragon/virgo3b = 1
|
||||
/mob/living/simple_mob/animal/space/gaslamp = 20,
|
||||
// /mob/living/simple_mob/otie/feral = 10,
|
||||
/mob/living/simple_mob/vore/dino/virgo3b = 5,
|
||||
/mob/living/simple_mob/vore/dragon/virgo3b = 1
|
||||
)
|
||||
|
||||
/obj/structure/mob_spawner/scanner/xenos
|
||||
@@ -176,10 +175,10 @@ It also makes it so a ghost wont know where all the goodies/mobs are.
|
||||
icon = 'icons/mob/actions.dmi'
|
||||
icon_state = "alien_egg"
|
||||
spawn_types = list(
|
||||
/mob/living/simple_animal/hostile/alien/drone = 20,
|
||||
/mob/living/simple_animal/hostile/alien = 10,
|
||||
/mob/living/simple_animal/hostile/alien/sentinel = 5,
|
||||
/mob/living/simple_animal/hostile/alien/queen = 1
|
||||
/mob/living/simple_mob/animal/space/alien/drone = 20,
|
||||
/mob/living/simple_mob/animal/space/alien = 10,
|
||||
/mob/living/simple_mob/animal/space/alien/sentinel = 5,
|
||||
/mob/living/simple_mob/animal/space/alien/queen = 1
|
||||
)
|
||||
|
||||
/obj/structure/mob_spawner/scanner/xenos/royal
|
||||
@@ -195,5 +194,5 @@ It also makes it so a ghost wont know where all the goodies/mobs are.
|
||||
icon = 'icons/mob/actions.dmi'
|
||||
icon_state = "alien_egg"
|
||||
spawn_types = list(
|
||||
/mob/living/simple_animal/hostile/alien/queen = 5,
|
||||
)
|
||||
/mob/living/simple_mob/animal/space/alien/queen = 5,
|
||||
)
|
||||
|
||||
@@ -18,44 +18,47 @@
|
||||
var/mob_retaliate = 0
|
||||
|
||||
/obj/random/mob/item_to_spawn()
|
||||
return pick(prob(10);/mob/living/simple_animal/lizard,
|
||||
prob(6);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(10);/mob/living/simple_animal/cat/fluff,
|
||||
prob(6);/mob/living/simple_animal/cat/kitten,
|
||||
prob(10);/mob/living/simple_animal/corgi,
|
||||
prob(6);/mob/living/simple_animal/corgi/puppy,
|
||||
prob(10);/mob/living/simple_animal/crab,
|
||||
prob(10);/mob/living/simple_animal/chicken,
|
||||
prob(6);/mob/living/simple_animal/chick,
|
||||
prob(10);/mob/living/simple_animal/cow,
|
||||
prob(6);/mob/living/simple_animal/retaliate/goat,
|
||||
prob(10);/mob/living/simple_animal/penguin,
|
||||
prob(10);/mob/living/simple_animal/mouse,
|
||||
prob(10);/mob/living/simple_animal/yithian,
|
||||
prob(10);/mob/living/simple_animal/tindalos,
|
||||
prob(10);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(3);/mob/living/simple_animal/parrot,
|
||||
prob(1);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(10);/mob/living/simple_mob/animal/passive/lizard,
|
||||
prob(6);/mob/living/simple_mob/animal/sif/diyaab,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/cat,
|
||||
prob(6);/mob/living/simple_mob/animal/passive/cat,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/dog/corgi,
|
||||
prob(6);/mob/living/simple_mob/animal/passive/dog/corgi/puppy,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/crab,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/chicken,
|
||||
prob(6);/mob/living/simple_mob/animal/passive/chick,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/cow,
|
||||
prob(6);/mob/living/simple_mob/animal/goat,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/penguin,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/mouse,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/yithian,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/tindalos,
|
||||
prob(10);/mob/living/simple_mob/animal/passive/dog/tamaskan,
|
||||
prob(3);/mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
prob(1);/mob/living/simple_mob/animal/passive/crab)
|
||||
|
||||
/obj/random/mob/spawn_item() //These should only ever have simple mobs.
|
||||
var/build_path = item_to_spawn()
|
||||
|
||||
var/mob/living/simple_animal/M = new build_path(src.loc)
|
||||
M.ai_inactive = 1 //Don't fight eachother while we're still setting up!
|
||||
if(mob_faction)
|
||||
M.faction = mob_faction
|
||||
M.returns_home = mob_returns_home
|
||||
M.wander = mob_wander
|
||||
M.wander_distance = mob_wander_distance
|
||||
if(overwrite_hostility)
|
||||
M.hostile = mob_hostile
|
||||
M.retaliate = mob_retaliate
|
||||
M.ai_inactive = 0 //Now you can kill eachother if your faction didn't override.
|
||||
var/mob/living/simple_mob/M = new build_path(src.loc)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(M.has_AI())
|
||||
var/datum/ai_holder/AI = M.ai_holder
|
||||
AI.go_sleep() //Don't fight eachother while we're still setting up!
|
||||
AI.returns_home = mob_returns_home
|
||||
AI.wander = mob_wander
|
||||
AI.max_home_distance = mob_wander_distance
|
||||
if(overwrite_hostility)
|
||||
AI.hostile = mob_hostile
|
||||
AI.retaliate = mob_retaliate
|
||||
AI.go_wake() //Now you can kill eachother if your faction didn't override.
|
||||
|
||||
if(pixel_x || pixel_y)
|
||||
M.pixel_x = pixel_x
|
||||
M.pixel_y = pixel_y
|
||||
|
||||
|
||||
/obj/random/mob/sif
|
||||
name = "Random Sif Animal"
|
||||
desc = "This is a random cold weather animal."
|
||||
@@ -65,14 +68,14 @@
|
||||
mob_wander_distance = 10
|
||||
|
||||
/obj/random/mob/sif/item_to_spawn()
|
||||
return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(15);/mob/living/simple_animal/crab,
|
||||
prob(15);/mob/living/simple_animal/penguin,
|
||||
prob(15);/mob/living/simple_animal/mouse,
|
||||
prob(15);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(2);/mob/living/simple_animal/hostile/giant_spider/frost,
|
||||
prob(1);/mob/living/simple_animal/hostile/goose,
|
||||
prob(20);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(30);/mob/living/simple_mob/animal/sif/diyaab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/crab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/penguin,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/mouse,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/dog/tamaskan,
|
||||
prob(2);/mob/living/simple_mob/animal/giant_spider/frost,
|
||||
prob(1);/mob/living/simple_mob/animal/space/goose,
|
||||
prob(20);/mob/living/simple_mob/animal/passive/crab)
|
||||
|
||||
|
||||
/obj/random/mob/sif/peaceful
|
||||
@@ -84,12 +87,12 @@
|
||||
mob_wander_distance = 12
|
||||
|
||||
/obj/random/mob/sif/peaceful/item_to_spawn()
|
||||
return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(15);/mob/living/simple_animal/crab,
|
||||
prob(15);/mob/living/simple_animal/penguin,
|
||||
prob(15);/mob/living/simple_animal/mouse,
|
||||
prob(15);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(20);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(30);/mob/living/simple_mob/animal/sif/diyaab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/crab,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/penguin,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/mouse,
|
||||
prob(15);/mob/living/simple_mob/animal/passive/dog/tamaskan,
|
||||
prob(20);/mob/living/simple_mob/animal/sif/hooligan_crab)
|
||||
|
||||
/obj/random/mob/sif/hostile
|
||||
name = "Random Hostile Sif Animal"
|
||||
@@ -97,9 +100,9 @@
|
||||
icon_state = "frost"
|
||||
|
||||
/obj/random/mob/sif/hostile/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/savik,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/frost,
|
||||
prob(45);/mob/living/simple_animal/hostile/shantak)
|
||||
return pick(prob(22);/mob/living/simple_mob/animal/sif/savik,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/frost,
|
||||
prob(45);/mob/living/simple_mob/animal/sif/shantak)
|
||||
|
||||
/obj/random/mob/spider
|
||||
name = "Random Spider" //Spiders should patrol where they spawn.
|
||||
@@ -110,9 +113,9 @@
|
||||
mob_wander_distance = 4
|
||||
|
||||
/obj/random/mob/spider/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/hunter,
|
||||
prob(45);/mob/living/simple_animal/hostile/giant_spider)
|
||||
return pick(prob(22);/mob/living/simple_mob/animal/giant_spider/nurse,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/hunter,
|
||||
prob(45);/mob/living/simple_mob/animal/giant_spider)
|
||||
|
||||
/obj/random/mob/spider/nurse
|
||||
name = "Random Nurse Spider"
|
||||
@@ -123,8 +126,8 @@
|
||||
mob_wander_distance = 4
|
||||
|
||||
/obj/random/mob/spider/nurse/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse/hat,
|
||||
prob(45);/mob/living/simple_animal/hostile/giant_spider/nurse)
|
||||
return pick(prob(22);/mob/living/simple_mob/animal/giant_spider/nurse/hat,
|
||||
prob(45);/mob/living/simple_mob/animal/giant_spider/nurse)
|
||||
|
||||
/obj/random/mob/spider/mutant
|
||||
name = "Random Mutant Spider"
|
||||
@@ -133,15 +136,15 @@
|
||||
|
||||
/obj/random/mob/spider/mutant/item_to_spawn()
|
||||
return pick(prob(5);/obj/random/mob/spider,
|
||||
prob(10);/mob/living/simple_animal/hostile/giant_spider/webslinger,
|
||||
prob(10);/mob/living/simple_animal/hostile/giant_spider/carrier,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/lurker,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/tunneler,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/pepper,
|
||||
prob(20);/mob/living/simple_animal/hostile/giant_spider/thermic,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/electric,
|
||||
prob(1);/mob/living/simple_animal/hostile/giant_spider/phorogenic,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/frost)
|
||||
prob(10);/mob/living/simple_mob/animal/giant_spider/webslinger,
|
||||
prob(10);/mob/living/simple_mob/animal/giant_spider/carrier,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/lurker,
|
||||
prob(33);/mob/living/simple_mob/animal/giant_spider/tunneler,
|
||||
prob(40);/mob/living/simple_mob/animal/giant_spider/pepper,
|
||||
prob(20);/mob/living/simple_mob/animal/giant_spider/thermic,
|
||||
prob(40);/mob/living/simple_mob/animal/giant_spider/electric,
|
||||
prob(1);/mob/living/simple_mob/animal/giant_spider/phorogenic,
|
||||
prob(40);/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
/obj/random/mob/robotic
|
||||
name = "Random Robot Mob"
|
||||
@@ -158,17 +161,18 @@
|
||||
mob_retaliate = 1
|
||||
|
||||
/obj/random/mob/robotic/item_to_spawn() //Hivebots have a total number of 'lots' equal to the lesser drone, at 60.
|
||||
return pick(prob(60);/mob/living/simple_animal/hostile/malf_drone/lesser,
|
||||
prob(50);/mob/living/simple_animal/hostile/malf_drone,
|
||||
prob(15);/mob/living/simple_animal/hostile/mecha/malf_drone,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_animal/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/guard)
|
||||
return pick(prob(60);/mob/living/simple_mob/mechanical/combat_drone/lesser,
|
||||
prob(50);/mob/living/simple_mob/mechanical/combat_drone,
|
||||
prob(15);/mob/living/simple_mob/mechanical/mecha/ripley,
|
||||
prob(15);/mob/living/simple_mob/mechanical/mecha/odysseus,
|
||||
prob(10);/mob/living/simple_mob/mechanical/hivebot,
|
||||
prob(15);/mob/living/simple_mob/mechanical/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_mob/mechanical/hivebot/ranged_damage,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/rapid,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong/guard)
|
||||
|
||||
/obj/random/mob/robotic/hivebot
|
||||
name = "Random Hivebot"
|
||||
@@ -178,14 +182,14 @@
|
||||
mob_faction = "hivebot"
|
||||
|
||||
/obj/random/mob/robotic/hivebot/item_to_spawn()
|
||||
return pick(prob(10);/mob/living/simple_animal/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_animal/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/guard)
|
||||
return pick(prob(10);/mob/living/simple_mob/mechanical/hivebot,
|
||||
prob(15);/mob/living/simple_mob/mechanical/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_mob/mechanical/hivebot/ranged_damage,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/rapid,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong,
|
||||
prob(5);/mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong/guard)
|
||||
|
||||
//Mice
|
||||
|
||||
@@ -195,7 +199,7 @@
|
||||
icon_state = "mouse_gray"
|
||||
|
||||
/obj/random/mob/mouse/item_to_spawn()
|
||||
return pick(prob(15);/mob/living/simple_animal/mouse/white,
|
||||
prob(30);/mob/living/simple_animal/mouse/brown,
|
||||
prob(30);/mob/living/simple_animal/mouse/gray,
|
||||
return pick(prob(15);/mob/living/simple_mob/animal/passive/mouse/white,
|
||||
prob(30);/mob/living/simple_mob/animal/passive/mouse/brown,
|
||||
prob(30);/mob/living/simple_mob/animal/passive/mouse/gray,
|
||||
prob(25);/obj/random/mouseremains) //because figuring out how to come up with it picking nothing is beyond my coding ability.
|
||||
|
||||
@@ -1531,24 +1531,24 @@ var/list/multi_point_spawns
|
||||
icon_state = "chicken_white"
|
||||
|
||||
/obj/random/mob/item_to_spawn()
|
||||
return pick(prob(10);/mob/living/simple_animal/lizard,
|
||||
prob(6);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(10);/mob/living/simple_animal/cat/fluff,
|
||||
prob(6);/mob/living/simple_animal/cat/kitten,
|
||||
prob(10);/mob/living/simple_animal/corgi,
|
||||
prob(6);/mob/living/simple_animal/corgi/puppy,
|
||||
prob(10);/mob/living/simple_animal/crab,
|
||||
prob(10);/mob/living/simple_animal/chicken,
|
||||
prob(6);/mob/living/simple_animal/chick,
|
||||
prob(10);/mob/living/simple_animal/cow,
|
||||
prob(6);/mob/living/simple_animal/retaliate/goat,
|
||||
prob(10);/mob/living/simple_animal/penguin,
|
||||
prob(10);/mob/living/simple_animal/mouse,
|
||||
prob(10);/mob/living/simple_animal/yithian,
|
||||
prob(10);/mob/living/simple_animal/tindalos,
|
||||
prob(10);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(3);/mob/living/simple_animal/parrot,
|
||||
prob(1);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(10);/mob/living/simple_mob/lizard,
|
||||
prob(6);/mob/living/simple_mob/retaliate/diyaab,
|
||||
prob(10);/mob/living/simple_mob/cat/fluff,
|
||||
prob(6);/mob/living/simple_mob/cat/kitten,
|
||||
prob(10);/mob/living/simple_mob/corgi,
|
||||
prob(6);/mob/living/simple_mob/corgi/puppy,
|
||||
prob(10);/mob/living/simple_mob/crab,
|
||||
prob(10);/mob/living/simple_mob/chicken,
|
||||
prob(6);/mob/living/simple_mob/chick,
|
||||
prob(10);/mob/living/simple_mob/cow,
|
||||
prob(6);/mob/living/simple_mob/retaliate/goat,
|
||||
prob(10);/mob/living/simple_mob/penguin,
|
||||
prob(10);/mob/living/simple_mob/mouse,
|
||||
prob(10);/mob/living/simple_mob/yithian,
|
||||
prob(10);/mob/living/simple_mob/tindalos,
|
||||
prob(10);/mob/living/simple_mob/corgi/tamaskan,
|
||||
prob(3);/mob/living/simple_mob/parrot,
|
||||
prob(1);/mob/living/simple_mob/giant_crab)
|
||||
|
||||
/obj/random/mob/sif
|
||||
name = "Random Sif Animal"
|
||||
@@ -1556,14 +1556,14 @@ var/list/multi_point_spawns
|
||||
icon_state = "penguin"
|
||||
|
||||
/obj/random/mob/sif/item_to_spawn()
|
||||
return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab,
|
||||
prob(15);/mob/living/simple_animal/crab,
|
||||
prob(15);/mob/living/simple_animal/penguin,
|
||||
prob(15);/mob/living/simple_animal/mouse,
|
||||
prob(15);/mob/living/simple_animal/corgi/tamaskan,
|
||||
prob(2);/mob/living/simple_animal/hostile/giant_spider/frost,
|
||||
prob(1);/mob/living/simple_animal/hostile/goose,
|
||||
prob(20);/mob/living/simple_animal/giant_crab)
|
||||
return pick(prob(30);/mob/living/simple_mob/retaliate/diyaab,
|
||||
prob(15);/mob/living/simple_mob/crab,
|
||||
prob(15);/mob/living/simple_mob/penguin,
|
||||
prob(15);/mob/living/simple_mob/mouse,
|
||||
prob(15);/mob/living/simple_mob/corgi/tamaskan,
|
||||
prob(2);/mob/living/simple_mob/hostile/giant_spider/frost,
|
||||
prob(1);/mob/living/simple_mob/hostile/goose,
|
||||
prob(20);/mob/living/simple_mob/giant_crab)
|
||||
|
||||
/obj/random/mob/sif/hostile
|
||||
name = "Random Hostile Sif Animal"
|
||||
@@ -1571,9 +1571,9 @@ var/list/multi_point_spawns
|
||||
icon_state = "frost"
|
||||
|
||||
/obj/random/mob/sif/hostile/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/savik,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/frost,
|
||||
prob(45);/mob/living/simple_animal/hostile/shantak)
|
||||
return pick(prob(22);/mob/living/simple_mob/hostile/savik,
|
||||
prob(33);/mob/living/simple_mob/hostile/giant_spider/frost,
|
||||
prob(45);/mob/living/simple_mob/hostile/shantak)
|
||||
|
||||
/obj/random/mob/spider
|
||||
name = "Random Spider"
|
||||
@@ -1581,9 +1581,9 @@ var/list/multi_point_spawns
|
||||
icon_state = "guard"
|
||||
|
||||
/obj/random/mob/spider/item_to_spawn()
|
||||
return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/hunter,
|
||||
prob(45);/mob/living/simple_animal/hostile/giant_spider)
|
||||
return pick(prob(22);/mob/living/simple_mob/hostile/giant_spider/nurse,
|
||||
prob(33);/mob/living/simple_mob/hostile/giant_spider/hunter,
|
||||
prob(45);/mob/living/simple_mob/hostile/giant_spider)
|
||||
|
||||
/obj/random/mob/spider/mutant
|
||||
name = "Random Mutant Spider"
|
||||
@@ -1592,15 +1592,15 @@ var/list/multi_point_spawns
|
||||
|
||||
/obj/random/mob/spider/mutant/item_to_spawn()
|
||||
return pick(prob(5);/obj/random/mob/spider,
|
||||
prob(10);/mob/living/simple_animal/hostile/giant_spider/webslinger,
|
||||
prob(10);/mob/living/simple_animal/hostile/giant_spider/carrier,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/lurker,
|
||||
prob(33);/mob/living/simple_animal/hostile/giant_spider/tunneler,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/pepper,
|
||||
prob(20);/mob/living/simple_animal/hostile/giant_spider/thermic,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/electric,
|
||||
prob(1);/mob/living/simple_animal/hostile/giant_spider/phorogenic,
|
||||
prob(40);/mob/living/simple_animal/hostile/giant_spider/frost)
|
||||
prob(10);/mob/living/simple_mob/hostile/giant_spider/webslinger,
|
||||
prob(10);/mob/living/simple_mob/hostile/giant_spider/carrier,
|
||||
prob(33);/mob/living/simple_mob/hostile/giant_spider/lurker,
|
||||
prob(33);/mob/living/simple_mob/hostile/giant_spider/tunneler,
|
||||
prob(40);/mob/living/simple_mob/hostile/giant_spider/pepper,
|
||||
prob(20);/mob/living/simple_mob/hostile/giant_spider/thermic,
|
||||
prob(40);/mob/living/simple_mob/hostile/giant_spider/electric,
|
||||
prob(1);/mob/living/simple_mob/hostile/giant_spider/phorogenic,
|
||||
prob(40);/mob/living/simple_mob/hostile/giant_spider/frost)
|
||||
|
||||
/obj/random/mob/robotic
|
||||
name = "Random Robot Mob"
|
||||
@@ -1608,17 +1608,17 @@ var/list/multi_point_spawns
|
||||
icon_state = "drone_dead"
|
||||
|
||||
/obj/random/mob/robotic/item_to_spawn() //Hivebots have a total number of 'lots' equal to the lesser drone, at 60.
|
||||
return pick(prob(60);/mob/living/simple_animal/hostile/malf_drone/lesser,
|
||||
prob(50);/mob/living/simple_animal/hostile/malf_drone,
|
||||
prob(15);/mob/living/simple_animal/hostile/mecha/malf_drone,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_animal/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/guard)
|
||||
return pick(prob(60);/mob/living/simple_mob/hostile/malf_drone/lesser,
|
||||
prob(50);/mob/living/simple_mob/hostile/malf_drone,
|
||||
prob(15);/mob/living/simple_mob/hostile/mecha/malf_drone,
|
||||
prob(10);/mob/living/simple_mob/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_mob/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_mob/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/guard)
|
||||
|
||||
/obj/random/mob/robotic/hivebot
|
||||
name = "Random Hivebot"
|
||||
@@ -1626,11 +1626,11 @@ var/list/multi_point_spawns
|
||||
icon_state = "drone3"
|
||||
|
||||
/obj/random/mob/robotic/hivebot/item_to_spawn()
|
||||
return pick(prob(10);/mob/living/simple_animal/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_animal/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_animal/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_animal/hostile/hivebot/range/guard)
|
||||
return pick(prob(10);/mob/living/simple_mob/hostile/hivebot,
|
||||
prob(15);/mob/living/simple_mob/hostile/hivebot/swarm,
|
||||
prob(10);/mob/living/simple_mob/hostile/hivebot/range,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/rapid,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/ion,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/laser,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/strong,
|
||||
prob(5);/mob/living/simple_mob/hostile/hivebot/range/guard)
|
||||
|
||||
@@ -181,15 +181,15 @@
|
||||
|
||||
/obj/random/outside_mob/item_to_spawn() // Special version for mobs to have the same faction.
|
||||
return pick(
|
||||
prob(50);/mob/living/simple_animal/retaliate/gaslamp,
|
||||
// prob(50);/mob/living/simple_animal/otie/feral, // Removed until Otie code is unfucked.
|
||||
prob(20);/mob/living/simple_animal/hostile/dino/virgo3b,
|
||||
prob(1);/mob/living/simple_animal/hostile/dragon/virgo3b)
|
||||
prob(50);/mob/living/simple_mob/animal/space/gaslamp,
|
||||
// prob(50);/mob/living/simple_mob/otie/feral, // Removed until Otie code is unfucked.
|
||||
prob(20);/mob/living/simple_mob/vore/dino/virgo3b,
|
||||
prob(1);/mob/living/simple_mob/vore/dragon/virgo3b)
|
||||
|
||||
/obj/random/outside_mob/spawn_item()
|
||||
. = ..()
|
||||
if(istype(., /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/this_mob = .
|
||||
if(istype(., /mob/living/simple_mob))
|
||||
var/mob/living/simple_mob/this_mob = .
|
||||
this_mob.faction = src.faction
|
||||
if (this_mob.minbodytemp > 200) // Temporary hotfix. Eventually I'll add code to change all mob vars to fit the environment they are spawned in.
|
||||
this_mob.minbodytemp = 200
|
||||
|
||||
@@ -176,8 +176,8 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker)
|
||||
if(!breakable || damage < 10 || !wallbreaker)
|
||||
/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
if(!breakable || damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return 0
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src] apart!</span>")
|
||||
user.do_attack_animation(src)
|
||||
|
||||
@@ -381,8 +381,8 @@
|
||||
else
|
||||
icon_state = icon_opened
|
||||
|
||||
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
|
||||
if(damage < 10 || !wallbreaker)
|
||||
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys")
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
@@ -459,4 +459,4 @@
|
||||
if(src.loc)
|
||||
if(istype(src.loc, /obj/structure/closet))
|
||||
return (loc.return_air_for_internal_lifeform(L))
|
||||
return return_air()
|
||||
return return_air()
|
||||
|
||||
@@ -90,23 +90,23 @@
|
||||
|
||||
/obj/structure/largecrate/animal/corgi
|
||||
name = "corgi carrier"
|
||||
starts_with = list(/mob/living/simple_animal/corgi)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/dog/corgi)
|
||||
|
||||
/obj/structure/largecrate/animal/cow
|
||||
name = "cow crate"
|
||||
starts_with = list(/mob/living/simple_animal/cow)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cow)
|
||||
|
||||
/obj/structure/largecrate/animal/goat
|
||||
name = "goat crate"
|
||||
starts_with = list(/mob/living/simple_animal/retaliate/goat)
|
||||
starts_with = list(/mob/living/simple_mob/animal/goat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat
|
||||
name = "cat carrier"
|
||||
starts_with = list(/mob/living/simple_animal/cat)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat)
|
||||
|
||||
/obj/structure/largecrate/animal/cat/bones
|
||||
starts_with = list(/mob/living/simple_animal/cat/fluff/bones)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/cat/bones)
|
||||
|
||||
/obj/structure/largecrate/animal/chick
|
||||
name = "chicken crate"
|
||||
starts_with = list(/mob/living/simple_animal/chick = 5)
|
||||
starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5)
|
||||
|
||||
@@ -5,28 +5,27 @@
|
||||
/obj/structure/largecrate/birds/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_crowbar())
|
||||
new /obj/item/stack/material/wood(src)
|
||||
new /mob/living/simple_animal/bird(src)
|
||||
new /mob/living/simple_animal/bird/kea(src)
|
||||
new /mob/living/simple_animal/bird/eclectus(src)
|
||||
new /mob/living/simple_animal/bird/greybird(src)
|
||||
new /mob/living/simple_animal/bird/eclectusf(src)
|
||||
new /mob/living/simple_animal/bird/blue_caique(src)
|
||||
new /mob/living/simple_animal/bird/white_caique(src)
|
||||
new /mob/living/simple_animal/bird/green_budgerigar(src)
|
||||
new /mob/living/simple_animal/bird/blue_Budgerigar(src)
|
||||
new /mob/living/simple_animal/bird/bluegreen_Budgerigar(src)
|
||||
new /mob/living/simple_animal/bird/commonblackbird(src)
|
||||
new /mob/living/simple_animal/bird/azuretit(src)
|
||||
new /mob/living/simple_animal/bird/europeanrobin(src)
|
||||
new /mob/living/simple_animal/bird/goldcrest(src)
|
||||
new /mob/living/simple_animal/bird/ringneckdove(src)
|
||||
new /mob/living/simple_animal/bird/cockatiel(src)
|
||||
new /mob/living/simple_animal/bird/white_cockatiel(src)
|
||||
new /mob/living/simple_animal/bird/yellowish_cockatiel(src)
|
||||
new /mob/living/simple_animal/bird/grey_cockatiel(src)
|
||||
new /mob/living/simple_animal/bird/too(src)
|
||||
new /mob/living/simple_animal/bird/hooded_too(src)
|
||||
new /mob/living/simple_animal/bird/pink_too(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/kea(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/eclectus(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/white_caique(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/black_bird(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/azure_tit(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/european_robin(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/goldcrest(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/ringneck_dove(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo(src)
|
||||
new /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo(src)
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/atom/movable/AM in contents)
|
||||
if(AM.simulated) AM.forceMove(T)
|
||||
@@ -39,72 +38,72 @@
|
||||
|
||||
/obj/structure/largecrate/animal/pred
|
||||
name = "Predator carrier"
|
||||
starts_with = list(/mob/living/simple_animal/catgirl)
|
||||
starts_with = list(/mob/living/simple_mob/vore/catgirl)
|
||||
|
||||
/obj/structure/largecrate/animal/pred/initialize() //This is nessesary to get a random one each time.
|
||||
starts_with = list(pick(/mob/living/simple_animal/retaliate/bee,
|
||||
/mob/living/simple_animal/catgirl;3,
|
||||
/mob/living/simple_animal/hostile/frog,
|
||||
/mob/living/simple_animal/horse,
|
||||
/mob/living/simple_animal/hostile/panther,
|
||||
/mob/living/simple_animal/hostile/giant_snake,
|
||||
/mob/living/simple_animal/hostile/wolf,
|
||||
/mob/living/simple_animal/hostile/bear;0.5,
|
||||
/mob/living/simple_animal/hostile/bear/brown;0.5,
|
||||
/mob/living/simple_animal/hostile/carp,
|
||||
/mob/living/simple_animal/hostile/mimic,
|
||||
/mob/living/simple_animal/hostile/rat,
|
||||
/mob/living/simple_animal/hostile/rat/passive,
|
||||
/mob/living/simple_animal/otie;0.5))
|
||||
starts_with = list(pick(/mob/living/simple_mob/vore/bee,
|
||||
/mob/living/simple_mob/vore/catgirl;3,
|
||||
/mob/living/simple_mob/vore/frog,
|
||||
/mob/living/simple_mob/horse,
|
||||
/mob/living/simple_mob/vore/panther,
|
||||
/mob/living/simple_mob/vore/giant_snake,
|
||||
/mob/living/simple_mob/vore/wolf,
|
||||
/mob/living/simple_mob/animal/space/bear;0.5,
|
||||
/mob/living/simple_mob/animal/space/carp,
|
||||
/mob/living/simple_mob/animal/space/mimic,
|
||||
/mob/living/simple_mob/vore/rat,
|
||||
/mob/living/simple_mob/vore/rat/passive,
|
||||
// /mob/living/simple_mob/otie;0.5
|
||||
))
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/animal/dangerous
|
||||
name = "Dangerous Predator carrier"
|
||||
starts_with = list(/mob/living/simple_animal/hostile/alien)
|
||||
starts_with = list(/mob/living/simple_mob/animal/space/alien)
|
||||
|
||||
/obj/structure/largecrate/animal/dangerous/initialize()
|
||||
starts_with = list(pick(/mob/living/simple_animal/hostile/carp/pike,
|
||||
/mob/living/simple_animal/hostile/deathclaw,
|
||||
/mob/living/simple_animal/hostile/dino,
|
||||
/mob/living/simple_animal/hostile/alien,
|
||||
/mob/living/simple_animal/hostile/alien/drone,
|
||||
/mob/living/simple_animal/hostile/alien/sentinel,
|
||||
/mob/living/simple_animal/hostile/alien/queen,
|
||||
/mob/living/simple_animal/otie/feral,
|
||||
/mob/living/simple_animal/otie/red,
|
||||
/mob/living/simple_animal/hostile/corrupthound))
|
||||
starts_with = list(pick(/mob/living/simple_mob/animal/space/carp/large,
|
||||
/mob/living/simple_mob/hostile/deathclaw,
|
||||
/mob/living/simple_mob/vore/dino,
|
||||
/mob/living/simple_mob/animal/space/alien,
|
||||
/mob/living/simple_mob/animal/space/alien/drone,
|
||||
/mob/living/simple_mob/animal/space/alien/sentinel,
|
||||
/mob/living/simple_mob/animal/space/alien/queen,
|
||||
// /mob/living/simple_mob/otie/feral,
|
||||
// /mob/living/simple_mob/otie/red,
|
||||
/mob/living/simple_mob/vore/corrupthound))
|
||||
return ..()
|
||||
|
||||
/*
|
||||
/obj/structure/largecrate/animal/guardbeast
|
||||
name = "VARMAcorp autoNOMous security solution"
|
||||
desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs."
|
||||
icon = 'icons/obj/storage_vr.dmi'
|
||||
icon_state = "sotiecrate"
|
||||
starts_with = list(/mob/living/simple_animal/otie/security)
|
||||
starts_with = list(/mob/living/simple_mob/otie/security)
|
||||
|
||||
/obj/structure/largecrate/animal/guardmutant
|
||||
name = "VARMAcorp autoNOMous security solution for hostile environments."
|
||||
desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs. This one can survive hostile atmosphere."
|
||||
icon = 'icons/obj/storage_vr.dmi'
|
||||
icon_state = "sotiecrate"
|
||||
starts_with = list(/mob/living/simple_animal/otie/security/phoron)
|
||||
starts_with = list(/mob/living/simple_mob/otie/security/phoron)
|
||||
|
||||
/obj/structure/largecrate/animal/otie
|
||||
name = "VARMAcorp adoptable reject (Dangerous!)"
|
||||
desc = "A warning on the side says the creature inside was returned to the supplier after injuring or devouring several unlucky members of the previous adoption family. It was given a second chance with the next customer. Godspeed and good luck with your new pet!"
|
||||
icon = 'icons/obj/storage_vr.dmi'
|
||||
icon_state = "otiecrate2"
|
||||
starts_with = list(/mob/living/simple_animal/otie/cotie)
|
||||
starts_with = list(/mob/living/simple_mob/otie/cotie)
|
||||
var/taped = 1
|
||||
|
||||
/obj/structure/largecrate/animal/otie/phoron
|
||||
name = "VARMAcorp adaptive beta subject (Experimental)"
|
||||
desc = "VARMAcorp experimental hostile environment adaptive breeding development kit. WARNING, DO NOT RELEASE IN WILD!"
|
||||
starts_with = list(/mob/living/simple_animal/otie/cotie/phoron)
|
||||
starts_with = list(/mob/living/simple_mob/otie/cotie/phoron)
|
||||
|
||||
/obj/structure/largecrate/animal/otie/phoron/initialize()
|
||||
starts_with = list(pick(/mob/living/simple_animal/otie/cotie/phoron;2,
|
||||
/mob/living/simple_animal/otie/red/friendly;0.5))
|
||||
starts_with = list(pick(/mob/living/simple_mob/otie/cotie/phoron;2,
|
||||
/mob/living/simple_mob/otie/red/friendly;0.5))
|
||||
return ..()
|
||||
|
||||
/obj/structure/largecrate/animal/otie/attack_hand(mob/living/carbon/human/M as mob)//I just couldn't decide between the icons lmao
|
||||
@@ -113,23 +112,24 @@
|
||||
icon_state = "otiecrate"
|
||||
taped = 0
|
||||
..()
|
||||
*/ //VORESTATION AI REMOVAL, Oties are still fucking broken.
|
||||
|
||||
/obj/structure/largecrate/animal/catgirl
|
||||
name = "Catgirl Crate"
|
||||
desc = "A sketchy looking crate with airholes that seems to have had most marks and stickers removed. You can almost make out 'genetically-engineered subject' written on it."
|
||||
starts_with = list(/mob/living/simple_animal/catgirl)
|
||||
starts_with = list(/mob/living/simple_mob/vore/catgirl)
|
||||
|
||||
/obj/structure/largecrate/animal/wolfgirl
|
||||
name = "Wolfgirl Crate"
|
||||
desc = "A sketchy looking crate with airholes that shakes and thuds every now and then. Someone seems to be demanding they be let out."
|
||||
starts_with = list(/mob/living/simple_animal/retaliate/wolfgirl)
|
||||
starts_with = list(/mob/living/simple_mob/vore/wolfgirl)
|
||||
|
||||
/obj/structure/largecrate/animal/fennec
|
||||
name = "Fennec Crate"
|
||||
desc = "Bounces around a lot. Looks messily packaged, were they in a hurry?"
|
||||
starts_with = list(/mob/living/simple_animal/fennec)
|
||||
starts_with = list(/mob/living/simple_mob/fennec)
|
||||
|
||||
/obj/structure/largecrate/animal/fennec/initialize()
|
||||
starts_with = list(pick(/mob/living/simple_animal/fennec,
|
||||
/mob/living/simple_animal/retaliate/fennix;0.5))
|
||||
starts_with = list(pick(/mob/living/simple_mob/fennec,
|
||||
/mob/living/simple_mob/vore/fennix;0.5))
|
||||
return ..()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/structure/ghost_pod/manual/corgi/create_occupant(var/mob/M)
|
||||
lightning_strike(get_turf(src), cosmetic = TRUE)
|
||||
density = FALSE
|
||||
var/mob/living/simple_animal/corgi/R = new(get_turf(src))
|
||||
var/mob/living/simple_mob/animal/passive/dog/corgi/R = new(get_turf(src))
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(R)
|
||||
to_chat(M, "<span class='notice'>You are a <b>Corgi</b>! Woof!</span>")
|
||||
@@ -47,4 +47,4 @@
|
||||
R.ghost_inhabit(M)
|
||||
visible_message("<span class='warning'>The blade shines brightly for a brief moment as [usr] pulls it out of the stone!</span>")
|
||||
log_and_message_admins("successfully acquired a cursed sword.")
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -83,8 +83,8 @@
|
||||
health = (displaced_health - round(current_damage / 4))
|
||||
cover = 25
|
||||
|
||||
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
|
||||
if(!damage || !wallbreaker)
|
||||
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart")
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return 0
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
else
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
if(ismouse(usr))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
|
||||
@@ -574,6 +574,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "engineering_pod-broken"
|
||||
density = TRUE
|
||||
anchored = FALSE // In case a dead mecha-mob dies in a bad spot.
|
||||
|
||||
chance_uncommon = 20
|
||||
chance_rare = 10
|
||||
@@ -615,7 +616,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/structure/loot_pile/mecha/ripley
|
||||
name = "ripley wreckage"
|
||||
desc = "The ruins of some unfortunate ripley. Perhaps something is salvageable."
|
||||
icon_states_to_use = list("ripley-broken", "firefighter-broken", "ripley-broken-old")
|
||||
icon_state = "ripley-broken"
|
||||
|
||||
common_loot = list(
|
||||
/obj/random/tool,
|
||||
@@ -649,6 +650,12 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/ripley/firefighter
|
||||
icon_state = "firefighter-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/ripley/random_sprite
|
||||
icon_states_to_use = list("ripley-broken", "firefighter-broken", "ripley-broken-old")
|
||||
|
||||
//Death-Ripley, same common, but more combat-exosuit-based
|
||||
/obj/structure/loot_pile/mecha/deathripley
|
||||
name = "strange ripley wreckage"
|
||||
@@ -719,6 +726,14 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/shocker
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/odysseus/murdysseus
|
||||
icon_state = "murdysseus-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/hoverpod
|
||||
name = "hoverpod wreckage"
|
||||
desc = "The ruins of some unfortunate hoverpod. Perhaps something is salvageable."
|
||||
icon_state = "engineering_pod"
|
||||
|
||||
/obj/structure/loot_pile/mecha/gygax
|
||||
name = "gygax wreckage"
|
||||
desc = "The ruins of some unfortunate gygax. Perhaps something is salvageable."
|
||||
@@ -759,6 +774,18 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/gygax/dark
|
||||
icon_state = "darkgygax-broken"
|
||||
|
||||
// Todo: Better loot.
|
||||
/obj/structure/loot_pile/mecha/gygax/dark/adv
|
||||
icon_state = "darkgygax_adv-broken"
|
||||
icon_scale = 1.5
|
||||
pixel_y = 8
|
||||
|
||||
/obj/structure/loot_pile/mecha/gygax/medgax
|
||||
icon_state = "medgax-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/durand
|
||||
name = "durand wreckage"
|
||||
desc = "The ruins of some unfortunate durand. Perhaps something is salvageable."
|
||||
@@ -799,6 +826,22 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/marauder
|
||||
name = "marauder wreckage"
|
||||
desc = "The ruins of some unfortunate marauder. Perhaps something is salvagable."
|
||||
icon_state = "marauder-broken"
|
||||
// Todo: Better loot.
|
||||
|
||||
/obj/structure/loot_pile/mecha/marauder/seraph
|
||||
name = "seraph wreckage"
|
||||
desc = "The ruins of some unfortunate seraph. Perhaps something is salvagable."
|
||||
icon_state = "seraph-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/marauder/mauler
|
||||
name = "mauler wreckage"
|
||||
desc = "The ruins of some unfortunate mauler. Perhaps something is salvagable."
|
||||
icon_state = "mauler-broken"
|
||||
|
||||
/obj/structure/loot_pile/mecha/phazon
|
||||
name = "phazon wreckage"
|
||||
desc = "The ruins of some unfortunate phazon. Perhaps something is salvageable."
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
if(istype(usr,/mob/living/simple_mob/animal/passive/mouse))
|
||||
return
|
||||
else if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
explosion_resistance = 5
|
||||
var/list/mobs_can_pass = list(
|
||||
/mob/living/bot,
|
||||
/mob/living/simple_animal/slime,
|
||||
/mob/living/simple_animal/mouse,
|
||||
/mob/living/simple_mob/slime/xenobio,
|
||||
/mob/living/simple_mob/animal/passive/mouse,
|
||||
/mob/living/silicon/robot/drone
|
||||
)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/last_spawn
|
||||
var/spawn_delay = 150
|
||||
var/randomize_spawning = FALSE
|
||||
var/creature_types = list(/mob/living/simple_animal/retaliate/diyaab)
|
||||
var/creature_types = list(/mob/living/simple_mob/animal/sif/diyaab)
|
||||
var/list/den_mobs
|
||||
var/den_faction //The faction of any spawned creatures.
|
||||
var/max_creatures = 3 //Maximum number of living creatures this nest can have at one time.
|
||||
|
||||
@@ -206,6 +206,6 @@
|
||||
/obj/structure/simple_door/cult/TryToSwitchState(atom/user)
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(!iscultist(L) && !istype(L, /mob/living/simple_animal/construct))
|
||||
if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct))
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
else
|
||||
if(istype(usr,/mob/living/simple_animal/mouse))
|
||||
if(istype(usr,/mob/living/simple_mob/animal/passive/mouse))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
|
||||
@@ -221,6 +221,7 @@
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/happy,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/zoom,
|
||||
prob(4);/obj/item/weapon/gun/energy/sizegun,
|
||||
prob(3);/obj/item/weapon/implanter/sizecontrol,
|
||||
prob(3);/obj/item/weapon/material/butterfly,
|
||||
prob(3);/obj/item/weapon/material/butterfly/switchblade,
|
||||
prob(3);/obj/item/clothing/gloves/knuckledusters,
|
||||
@@ -265,7 +266,7 @@
|
||||
desc = "A small heap of trash, perfect for mice to nest in."
|
||||
icon = 'icons/obj/trash_piles.dmi'
|
||||
icon_state = "randompile"
|
||||
spawn_types = list(/mob/living/simple_animal/mouse)
|
||||
spawn_types = list(/mob/living/simple_mob/animal/passive/mouse)
|
||||
simultaneous_spawns = 1
|
||||
destructible = 1
|
||||
spawn_delay = 1 HOUR
|
||||
@@ -293,4 +294,4 @@
|
||||
|
||||
/obj/structure/mob_spawner/mouse_nest/get_death_report(var/mob/living/L)
|
||||
..()
|
||||
last_spawn = rand(world.time - spawn_delay, world.time)
|
||||
last_spawn = rand(world.time - spawn_delay, world.time)
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
var/shardtype = /obj/item/weapon/material/shard
|
||||
var/glasstype = null // Set this in subtypes. Null is assumed strange or otherwise impossible to dismantle, such as for shuttle glass.
|
||||
var/silicate = 0 // number of units of silicate
|
||||
var/fulltile = FALSE // Set to true on full-tile variants.
|
||||
|
||||
/obj/structure/window/examine(mob/user)
|
||||
. = ..(user)
|
||||
@@ -128,16 +129,10 @@
|
||||
/obj/structure/window/blob_act()
|
||||
take_damage(50)
|
||||
|
||||
//TODO: Make full windows a separate type of window.
|
||||
//Once a full window, it will always be a full window, so there's no point
|
||||
//having the same type for both.
|
||||
/obj/structure/window/proc/is_full_window()
|
||||
return (dir == SOUTHWEST || dir == SOUTHEAST || dir == NORTHWEST || dir == NORTHEAST)
|
||||
|
||||
/obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return 1
|
||||
if(is_full_window())
|
||||
if(is_fulltile())
|
||||
return 0 //full tile window, you can't move into it!
|
||||
if(get_dir(loc, target) & dir)
|
||||
return !density
|
||||
@@ -206,7 +201,7 @@
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
if(!damage)
|
||||
return
|
||||
if(damage >= 10)
|
||||
if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
visible_message("<span class='danger'>[user] smashes into [src]!</span>")
|
||||
if(reinf)
|
||||
damage = damage / 2
|
||||
@@ -388,8 +383,6 @@
|
||||
anchored = 0
|
||||
state = 0
|
||||
update_verbs()
|
||||
if(is_fulltile())
|
||||
maxhealth *= 2
|
||||
|
||||
health = maxhealth
|
||||
|
||||
@@ -416,9 +409,7 @@
|
||||
|
||||
//checks if this window is full-tile one
|
||||
/obj/structure/window/proc/is_fulltile()
|
||||
if(dir & (dir - 1))
|
||||
return 1
|
||||
return 0
|
||||
return fulltile
|
||||
|
||||
//This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc!
|
||||
/obj/structure/window/proc/update_nearby_icons()
|
||||
@@ -484,6 +475,10 @@
|
||||
maxhealth = 12.0
|
||||
force_threshold = 3
|
||||
|
||||
/obj/structure/window/basic/full
|
||||
maxhealth = 24
|
||||
fulltile = TRUE
|
||||
|
||||
/obj/structure/window/phoronbasic
|
||||
name = "phoron window"
|
||||
desc = "A borosilicate alloy window. It seems to be quite strong."
|
||||
@@ -497,8 +492,8 @@
|
||||
force_threshold = 5
|
||||
|
||||
/obj/structure/window/phoronbasic/full
|
||||
dir = SOUTHWEST
|
||||
maxhealth = 80
|
||||
fulltile = TRUE
|
||||
|
||||
/obj/structure/window/phoronreinforced
|
||||
name = "reinforced borosilicate window"
|
||||
@@ -514,8 +509,8 @@
|
||||
force_threshold = 10
|
||||
|
||||
/obj/structure/window/phoronreinforced/full
|
||||
dir = SOUTHWEST
|
||||
maxhealth = 160
|
||||
fulltile = TRUE
|
||||
|
||||
/obj/structure/window/reinforced
|
||||
name = "reinforced window"
|
||||
@@ -530,9 +525,9 @@
|
||||
force_threshold = 6
|
||||
|
||||
/obj/structure/window/reinforced/full
|
||||
dir = SOUTHWEST
|
||||
icon_state = "fwindow"
|
||||
maxhealth = 80
|
||||
fulltile = TRUE
|
||||
|
||||
/obj/structure/window/reinforced/tinted
|
||||
name = "tinted window"
|
||||
@@ -567,9 +562,9 @@
|
||||
var/id
|
||||
|
||||
/obj/structure/window/reinforced/polarized/full
|
||||
dir = SOUTHWEST
|
||||
icon_state = "fwindow"
|
||||
maxhealth = 80
|
||||
fulltile = TRUE
|
||||
|
||||
/obj/structure/window/reinforced/polarized/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/device/multitool) && !anchored) // Only allow programming if unanchored!
|
||||
|
||||
@@ -27,16 +27,16 @@
|
||||
|
||||
cleaving = TRUE
|
||||
var/hit_mobs = 0
|
||||
for(var/mob/living/simple_animal/SA in range(get_turf(target), 1))
|
||||
if(SA.stat == DEAD) // Don't beat a dead horse.
|
||||
for(var/mob/living/simple_mob/SM in range(get_turf(target), 1))
|
||||
if(SM.stat == DEAD) // Don't beat a dead horse.
|
||||
continue
|
||||
if(SA == user) // Don't hit ourselves. Simple mobs shouldn't be able to do this but that might change later to be able to hit all mob/living-s.
|
||||
if(SM == user) // Don't hit ourselves. Simple mobs shouldn't be able to do this but that might change later to be able to hit all mob/living-s.
|
||||
continue
|
||||
if(SA == target) // We (presumably) already hit the target before cleave() was called. orange() should prevent this but just to be safe...
|
||||
if(SM == target) // We (presumably) already hit the target before cleave() was called. orange() should prevent this but just to be safe...
|
||||
continue
|
||||
if(!SA.Adjacent(user) || !SA.Adjacent(target)) // Cleaving only hits mobs near the target mob and user.
|
||||
if(!SM.Adjacent(user) || !SM.Adjacent(target)) // Cleaving only hits mobs near the target mob and user.
|
||||
continue
|
||||
if(resolve_attackby(SA, user, attack_modifier = 0.5)) // Hit them with the weapon. This won't cause recursive cleaving due to the cleaving variable being set to true.
|
||||
if(resolve_attackby(SM, user, attack_modifier = 0.5)) // Hit them with the weapon. This won't cause recursive cleaving due to the cleaving variable being set to true.
|
||||
hit_mobs++
|
||||
|
||||
cleave_visual(user, target)
|
||||
@@ -55,4 +55,4 @@
|
||||
// This is purely the visual effect of cleaving.
|
||||
/obj/item/weapon/proc/cleave_visual(var/mob/living/user, var/mob/living/target)
|
||||
var/obj/effect/temporary_effect/cleave_attack/E = new(get_turf(src))
|
||||
E.dir = get_dir(user, target)
|
||||
E.dir = get_dir(user, target)
|
||||
|
||||
Reference in New Issue
Block a user