Merge remote-tracking branch 'refs/remotes/origin/master' into oties-and-wild-removed

This commit is contained in:
Spades
2017-08-26 15:51:47 -04:00
20 changed files with 368 additions and 48 deletions
+7 -1
View File
@@ -42,6 +42,12 @@
/obj/item/mecha_parts/part/phazon_right_arm,
/obj/item/mecha_parts/part/phazon_right_leg,
/obj/item/mecha_parts/part/phazon_torso,
/obj/item/device/bodysnatcher,
/obj/item/weapon/bluespace_harpoon,
/obj/item/weapon/permit,
/obj/item/device/perfect_tele,
/obj/item/device/sleevemate,
/obj/item/weapon/disk/nifsoft/compliance,
/obj/item/seeds/ambrosiadeusseed,
/obj/item/seeds/ambrosiavulgarisseed,
/obj/item/seeds/libertymycelium,
@@ -92,4 +98,4 @@
slot_flags = SLOT_BELT
storage_slots = 7
can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar/havana)
icon_type = "cigar"
icon_type = "cigar"
+106
View File
@@ -0,0 +1,106 @@
/obj/structure/mob_spawner
name = "mob spawner"
desc = "This shouldn't be seen, yell at a dev."
icon = 'icons/effects/effects.dmi'
icon_state = "rift"
anchored = 1
var/last_spawn = 0
var/spawn_delay = 10 MINUTES
var/list/spawn_types = list(
/mob/living/simple_animal/corgi = 100,
/mob/living/simple_animal/cat = 25
)
var/total_spawns = -1 //Total mob spawns, over all time, -1 for no limit
var/simultaneous_spawns = 3 //Max spawned mobs active at one time
var/mob_faction
var/destructible = 0
var/health = 50
var/list/spawned_mobs = list()
/obj/structure/mob_spawner/initialize()
..()
processing_objects.Add(src)
last_spawn = world.time + rand(0,spawn_delay)
/obj/structure/mob_spawner/Destroy()
processing_objects.Remove(src)
for(var/mob/living/L in spawned_mobs)
L.source_spawner = null
spawned_mobs.Cut()
return ..()
/obj/structure/mob_spawner/process()
if(!can_spawn())
return
var/chosen_mob = choose_spawn()
if(chosen_mob)
do_spawn(chosen_mob)
/obj/structure/mob_spawner/proc/can_spawn()
if(!total_spawns)
return 0
if(spawned_mobs.len >= simultaneous_spawns)
return 0
if(world.time < last_spawn + spawn_delay)
return 0
return 1
/obj/structure/mob_spawner/proc/choose_spawn()
return pickweight(spawn_types)
/obj/structure/mob_spawner/proc/do_spawn(var/mob_path)
if(!ispath(mob_path))
return 0
var/mob/living/L = new mob_path(get_turf(src))
L.source_spawner = src
spawned_mobs.Add(L)
last_spawn = world.time
if(total_spawns > 0)
total_spawns--
if(mob_faction)
L.faction = mob_faction
return L
/obj/structure/mob_spawner/proc/get_death_report(var/mob/living/L)
if(L in spawned_mobs)
spawned_mobs.Remove(L)
/obj/structure/mob_spawner/attackby(var/obj/item/I, var/mob/living/user)
if(!I.force || I.flags & NOBLUDGEON || !destructible)
return
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.do_attack_animation(src)
visible_message("<span class='warning'>\The [src] has been [I.attack_verb.len ? "[pick(I.attack_verb)]":"attacked"] with \the [I] by [user].</span>")
take_damage(I.force)
/obj/structure/mob_spawner/bullet_act(var/obj/item/projectile/Proj)
..()
if(destructible)
take_damage(Proj.get_structure_damage())
/obj/structure/mob_spawner/proc/take_damage(var/damage)
health -= damage
if(health <= 0)
visible_message("<span class='warning'>\The [src] breaks apart!</span>")
qdel(src)
/obj/structure/mob_spawner/clear_zlevel/can_spawn()
if(!..())
return 0
var/turf/T = get_turf(src)
if(!T)
return 0
for(var/mob/living/L in player_list)
var/turf/L_T
if(L.stat == DEAD)
continue
L_T = get_turf(L)
if(T.z == L_T.z)
return 0
return 1
@@ -9,6 +9,8 @@
var/list/searchedby = list()// Characters that have searched this trashpile, with values of searched time.
var/mob/living/hider // A simple animal that might be hiding in the pile
var/obj/structure/mob_spawner/mouse_nest/mouse_nest = null
var/chance_alpha = 79 // Alpha list is junk items and normal random stuff.
var/chance_beta = 20 // Beta list is actually maybe some useful illegal items. If it's not alpha or gamma, it's beta.
var/chance_gamma = 1 // Gamma list is unique items only, and will only spawn one of each. This is a sub-chance of beta chance.
@@ -40,6 +42,12 @@
"boxfort",
"trashbag",
"brokecomp")
mouse_nest = new(src)
/obj/structure/trash_pile/Destroy()
qdel(mouse_nest)
mouse_nest = null
return ..()
/obj/structure/trash_pile/attackby(obj/item/W as obj, mob/user as mob)
var/w_type = W.type
@@ -252,3 +260,31 @@
else
return produce_beta_item()
/obj/structure/mob_spawner/mouse_nest
name = "trash"
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)
simultaneous_spawns = 1
destructible = 1
/obj/structure/mob_spawner/mouse_nest/initialize()
..()
icon_state = pick(
"pile1",
"pile2",
"pilechair",
"piletable",
"pilevending",
"brtrashpile",
"microwavepile",
"rackpile",
"boxfort",
"trashbag",
"brokecomp")
/obj/structure/mob_spawner/mouse_nest/do_spawn(var/mob_path)
. = ..()
var/atom/A = get_holder_at_turf_level(src)
A.visible_message("[.] crawls out of \the [src].")