Merge branch 'master' into upstream-merge-5654

This commit is contained in:
Spades
2019-03-01 05:42:07 -05:00
committed by GitHub
736 changed files with 29915 additions and 32830 deletions
@@ -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()
+10
View File
@@ -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
+14 -10
View File
@@ -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"
+1 -1
View File
@@ -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>")
+39 -8
View File
@@ -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
+17 -6
View File
@@ -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
+11 -9
View File
@@ -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.")
+1 -1
View File
@@ -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()
-11
View File
@@ -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
+1 -1
View File
@@ -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
+39 -12
View File
@@ -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)
+1 -1
View File
@@ -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("&#39;" = "",">" = "","<" = "","(" = "",")" = "", "~" = "")
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("&#39;" = "",">" = "","<" = "","(" = "",")" = "", "~" = "")
message = replace_characters(message, replacechars)
var/static/regex/say_in_me = new/regex("(&#34;)(.*?)(&#)", "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)
+2 -3
View File
@@ -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>")
+14 -15
View File
@@ -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,
)
+86 -82
View File
@@ -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.
+60 -60
View File
@@ -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)
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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.")
..()
..()
+2 -2
View File
@@ -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>")
+1 -1
View File
@@ -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
+44 -1
View File
@@ -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."
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
)
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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
+3 -2
View File
@@ -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)
+12 -17
View File
@@ -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!
+7 -7
View File
@@ -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)