mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-28 19:11:37 +00:00
Merge branch 'bleeding-edge-freeze' of https://github.com/Baystation12/Baystation12 into bs12_with_tgport
Conflicts: baystation12.dme code/game/objects/items/toys.dm icons/mob/back.dmi icons/mob/suit.dmi icons/mob/uniform.dmi icons/obj/clothing/suits.dmi icons/obj/clothing/uniforms.dmi icons/obj/weapons.dmi Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
59
code/WorkInProgress/Cael_Aislinn/Jungle/falsewall.dm
Normal file
59
code/WorkInProgress/Cael_Aislinn/Jungle/falsewall.dm
Normal file
@@ -0,0 +1,59 @@
|
||||
//simplified copy of /obj/structure/falsewall
|
||||
|
||||
/obj/effect/landmark/falsewall_spawner
|
||||
name = "falsewall spawner"
|
||||
|
||||
/obj/structure/temple_falsewall
|
||||
name = "wall"
|
||||
anchored = 1
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "plasma0"
|
||||
opacity = 1
|
||||
var/closed_wall_dir = 0
|
||||
var/opening = 0
|
||||
var/mineral = "plasma"
|
||||
var/is_metal = 0
|
||||
|
||||
/obj/structure/temple_falsewall/New()
|
||||
..()
|
||||
spawn(10)
|
||||
if(prob(95))
|
||||
desc = pick("Something seems slightly off about it.","")
|
||||
|
||||
var/junction = 0 //will be used to determine from which side the wall is connected to other walls
|
||||
|
||||
for(var/turf/unsimulated/wall/W in orange(src,1))
|
||||
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
|
||||
junction |= get_dir(src,W)
|
||||
|
||||
closed_wall_dir = junction
|
||||
density = 1
|
||||
icon_state = "[mineral][closed_wall_dir]"
|
||||
|
||||
/obj/structure/temple_falsewall/attack_hand(mob/user as mob)
|
||||
if(opening)
|
||||
return
|
||||
|
||||
if(density)
|
||||
opening = 1
|
||||
if(is_metal)
|
||||
icon_state = "metalfwall_open"
|
||||
flick("metalfwall_opening", src)
|
||||
else
|
||||
icon_state = "[mineral]fwall_open"
|
||||
flick("[mineral]fwall_opening", src)
|
||||
sleep(15)
|
||||
src.density = 0
|
||||
SetOpacity(0)
|
||||
opening = 0
|
||||
else
|
||||
opening = 1
|
||||
icon_state = "[mineral][closed_wall_dir]"
|
||||
if(is_metal)
|
||||
flick("metalfwall_closing", src)
|
||||
else
|
||||
flick("[mineral]fwall_closing", src)
|
||||
density = 1
|
||||
sleep(15)
|
||||
SetOpacity(1)
|
||||
opening = 0
|
||||
347
code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dm
Normal file
347
code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dm
Normal file
@@ -0,0 +1,347 @@
|
||||
//some testin stuff
|
||||
|
||||
#define PATH_SPREAD_CHANCE_START 90
|
||||
#define PATH_SPREAD_CHANCE_LOSS_UPPER 80
|
||||
#define PATH_SPREAD_CHANCE_LOSS_LOWER 50
|
||||
|
||||
#define RIVER_SPREAD_CHANCE_START 100
|
||||
#define RIVER_SPREAD_CHANCE_LOSS_UPPER 65
|
||||
#define RIVER_SPREAD_CHANCE_LOSS_LOWER 50
|
||||
|
||||
#define RANDOM_UPPER_X 100
|
||||
#define RANDOM_UPPER_Y 100
|
||||
|
||||
#define RANDOM_LOWER_X 18
|
||||
#define RANDOM_LOWER_Y 18
|
||||
|
||||
/area/jungle
|
||||
name = "jungle"
|
||||
icon = 'code/workinprogress/cael_aislinn/jungle/jungle.dmi'
|
||||
icon_state = "area"
|
||||
lighting_use_dynamic = 0
|
||||
luminosity = 1
|
||||
|
||||
//randomly spawns, will create paths around the map
|
||||
/obj/effect/landmark/path_waypoint
|
||||
name = "path waypoint"
|
||||
icon_state = "x2"
|
||||
var/connected = 0
|
||||
|
||||
/obj/effect/landmark/temple
|
||||
name = "temple entrance"
|
||||
icon_state = "x2"
|
||||
var/obj/structure/ladder/my_ladder
|
||||
|
||||
New()
|
||||
//pick a random temple to link to
|
||||
var/list/waypoints = list()
|
||||
for(var/obj/effect/landmark/temple/destination/T in world)
|
||||
waypoints.Add(T)
|
||||
var/obj/effect/landmark/temple/destination/dest_temple = pick(waypoints)
|
||||
dest_temple.init()
|
||||
|
||||
//connect this landmark to the other
|
||||
my_ladder = new /obj/structure/ladder(src.loc)
|
||||
my_ladder.id = dest_temple.my_ladder.id
|
||||
dest_temple.my_ladder.up = my_ladder
|
||||
|
||||
//delete the landmarks now that we're finished
|
||||
del(dest_temple)
|
||||
del(src)
|
||||
|
||||
/obj/effect/landmark/temple/destination/New()
|
||||
//nothing
|
||||
|
||||
/obj/effect/landmark/temple/destination/proc/init()
|
||||
my_ladder = new /obj/structure/ladder(src.loc)
|
||||
my_ladder.id = rand(999)
|
||||
my_ladder.height = -1
|
||||
|
||||
//loop over the walls in the temple and make them a random pre-chosen mineral (null is a stand in for plasma, which the walls already are)
|
||||
//treat plasma slightly differently because it's the default wall type
|
||||
var/mineral = pick("uranium","sandstone","gold","iron","silver","diamond","clown","plasma")
|
||||
//world << "init [mineral]"
|
||||
var/area/my_area = get_area(src)
|
||||
var/list/temple_turfs = get_area_turfs(my_area.type)
|
||||
|
||||
for(var/turf/simulated/floor/T in temple_turfs)
|
||||
|
||||
for(var/obj/effect/landmark/falsewall_spawner/F in T.contents)
|
||||
var/obj/structure/temple_falsewall/fwall = new(F.loc)
|
||||
fwall.mineral = mineral
|
||||
if(mineral == "iron")
|
||||
fwall.is_metal = 1
|
||||
del(F)
|
||||
|
||||
for(var/obj/effect/landmark/door_spawner/D in T.contents)
|
||||
var/spawn_type
|
||||
if(mineral == "iron")
|
||||
spawn_type = text2path("/obj/machinery/door/airlock/vault")
|
||||
else
|
||||
spawn_type = text2path("/obj/machinery/door/airlock/[mineral]")
|
||||
new spawn_type(D.loc)
|
||||
del(D)
|
||||
|
||||
for(var/turf/unsimulated/wall/T in temple_turfs)
|
||||
if(mineral != "plasma")
|
||||
T.icon_state = replacetext(T.icon_state, "plasma", mineral)
|
||||
|
||||
/*for(var/obj/effect/landmark/falsewall_spawner/F in T.contents)
|
||||
//world << "falsewall_spawner found in wall"
|
||||
var/obj/structure/temple_falsewall/fwall = new(F.loc)
|
||||
fwall.mineral = mineral
|
||||
del(F)
|
||||
|
||||
for(var/obj/effect/landmark/door_spawner/D in T.contents)
|
||||
//world << "door_spawner found in wall"
|
||||
T = new /turf/unsimulated/floor(T.loc)
|
||||
T.icon_state = "dark"
|
||||
var/spawn_type = text2path("/obj/machinery/door/airlock/[door_mineral]")
|
||||
new spawn_type(T)
|
||||
del(D)*/
|
||||
|
||||
//a shuttle has crashed somewhere on the map, it should have a power cell to let the adventurers get home
|
||||
/area/jungle/crash_ship_source
|
||||
icon_state = "crash"
|
||||
|
||||
/area/jungle/crash_ship_clean
|
||||
icon_state = "crash"
|
||||
|
||||
/area/jungle/crash_ship_one
|
||||
icon_state = "crash"
|
||||
|
||||
/area/jungle/crash_ship_two
|
||||
icon_state = "crash"
|
||||
|
||||
/area/jungle/crash_ship_three
|
||||
icon_state = "crash"
|
||||
|
||||
/area/jungle/crash_ship_four
|
||||
icon_state = "crash"
|
||||
|
||||
//randomly spawns, will create rivers around the map
|
||||
//uses the same logic as jungle paths
|
||||
/obj/effect/landmark/river_waypoint
|
||||
name = "river source waypoint"
|
||||
var/connected = 0
|
||||
|
||||
/obj/machinery/jungle_controller
|
||||
name = "jungle controller"
|
||||
desc = "a mysterious and ancient piece of machinery"
|
||||
var/list/animal_spawners = list()
|
||||
|
||||
New()
|
||||
..()
|
||||
Initialise()
|
||||
|
||||
/obj/machinery/jungle_controller/proc/Initialise()
|
||||
set background = 1
|
||||
spawn(0)
|
||||
world << "\red \b Setting up jungle, this may take a moment..."
|
||||
|
||||
//crash dat shuttle
|
||||
var/area/start_location = locate(/area/jungle/crash_ship_source)
|
||||
var/area/clean_location = locate(/area/jungle/crash_ship_clean)
|
||||
var/list/ship_locations = list(/area/jungle/crash_ship_one, /area/jungle/crash_ship_two, /area/jungle/crash_ship_three, /area/jungle/crash_ship_four)
|
||||
var/area/end_location = locate( pick(ship_locations) )
|
||||
ship_locations -= end_location.type
|
||||
|
||||
start_location.move_contents_to(end_location)
|
||||
for(var/area_type in ship_locations)
|
||||
var/area/cur_location = locate(area_type)
|
||||
clean_location.copy_turfs_to(cur_location)
|
||||
|
||||
//drop some random river nodes
|
||||
var/list/river_nodes = list()
|
||||
var/max = rand(1,3)
|
||||
var/num_spawned = 0
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!istype(J))
|
||||
continue
|
||||
if(!J.bushes_spawn)
|
||||
continue
|
||||
river_nodes.Add(new /obj/effect/landmark/river_waypoint(J))
|
||||
num_spawned++
|
||||
|
||||
//make some randomly pathing rivers
|
||||
for(var/obj/effect/landmark/river_waypoint/W in world)
|
||||
if (W.z != src.z || W.connected)
|
||||
continue
|
||||
|
||||
W.connected = 1
|
||||
var/turf/cur_turf = new /turf/unsimulated/jungle/water(get_turf(W))
|
||||
var/turf/target_turf = get_turf(pick(river_nodes))
|
||||
|
||||
var/detouring = 0
|
||||
var/cur_dir = get_dir(cur_turf, target_turf)
|
||||
//
|
||||
while(cur_turf != target_turf)
|
||||
//randomly snake around a bit
|
||||
if(detouring)
|
||||
if(prob(20))
|
||||
detouring = 0
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
else if(prob(20))
|
||||
detouring = 1
|
||||
if(prob(50))
|
||||
cur_dir = turn(cur_dir, 45)
|
||||
else
|
||||
cur_dir = turn(cur_dir, -45)
|
||||
else
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
|
||||
var/skip = 0
|
||||
if(!istype(cur_turf, /turf/unsimulated/jungle) || istype(cur_turf, /turf/unsimulated/jungle/rock))
|
||||
detouring = 0
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
continue
|
||||
|
||||
if(!skip)
|
||||
var/turf/unsimulated/jungle/water/water_turf = new(cur_turf)
|
||||
water_turf.Spread(75, rand(65, 25))
|
||||
|
||||
var/list/path_nodes = list()
|
||||
|
||||
//place some ladders leading down to pre-generated temples
|
||||
max = rand(2,5)
|
||||
num_spawned = 0
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !J.bushes_spawn)
|
||||
continue
|
||||
new /obj/effect/landmark/temple(J)
|
||||
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
|
||||
num_spawned++
|
||||
|
||||
//put a native tribe somewhere
|
||||
num_spawned = 0
|
||||
while(num_spawned < 1)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !J.bushes_spawn)
|
||||
continue
|
||||
new /obj/effect/jungle_tribe_spawn(J)
|
||||
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
|
||||
num_spawned++
|
||||
|
||||
//place some random path waypoints to confuse players
|
||||
max = rand(1,3)
|
||||
num_spawned = 0
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !J.bushes_spawn)
|
||||
continue
|
||||
path_nodes.Add(new /obj/effect/landmark/path_waypoint(J))
|
||||
num_spawned++
|
||||
|
||||
//get any path nodes placed on the map
|
||||
for(var/obj/effect/landmark/path_waypoint/W in world)
|
||||
if (W.z == src.z)
|
||||
path_nodes.Add(W)
|
||||
|
||||
//make random, connecting paths
|
||||
for(var/obj/effect/landmark/path_waypoint/W in path_nodes)
|
||||
if (W.connected)
|
||||
continue
|
||||
|
||||
W.connected = 1
|
||||
var/turf/cur_turf = get_turf(W)
|
||||
path_nodes.Remove(W)
|
||||
var/turf/target_turf = get_turf(pick(path_nodes))
|
||||
path_nodes.Add(W)
|
||||
//
|
||||
cur_turf = new /turf/unsimulated/jungle/path(cur_turf)
|
||||
|
||||
var/detouring = 0
|
||||
var/cur_dir = get_dir(cur_turf, target_turf)
|
||||
//
|
||||
while(cur_turf != target_turf)
|
||||
//randomly snake around a bit
|
||||
if(detouring)
|
||||
if(prob(20) || get_dist(cur_turf, target_turf) < 5)
|
||||
detouring = 0
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
else if(prob(20) && get_dist(cur_turf, target_turf) > 5)
|
||||
detouring = 1
|
||||
if(prob(50))
|
||||
cur_dir = turn(cur_dir, 45)
|
||||
else
|
||||
cur_dir = turn(cur_dir, -45)
|
||||
else
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
|
||||
//move a step forward
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
|
||||
//if we're not a jungle turf, get back to what we were doing
|
||||
if(!istype(cur_turf, /turf/unsimulated/jungle/))
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
continue
|
||||
|
||||
var/turf/unsimulated/jungle/J = cur_turf
|
||||
if(istype(J, /turf/unsimulated/jungle/impenetrable) || istype(J, /turf/unsimulated/jungle/water/deep))
|
||||
cur_dir = get_dir(cur_turf, target_turf)
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
continue
|
||||
|
||||
if(!istype(J, /turf/unsimulated/jungle/water))
|
||||
J = new /turf/unsimulated/jungle/path(cur_turf)
|
||||
J.Spread(PATH_SPREAD_CHANCE_START, rand(PATH_SPREAD_CHANCE_LOSS_UPPER, PATH_SPREAD_CHANCE_LOSS_LOWER))
|
||||
|
||||
//create monkey spawners
|
||||
num_spawned = 0
|
||||
max = rand(3,6)
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !J.bushes_spawn)
|
||||
continue
|
||||
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/monkey(J))
|
||||
num_spawned++
|
||||
|
||||
//create panther spawners
|
||||
num_spawned = 0
|
||||
max = rand(6,12)
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !istype(J) || !J.bushes_spawn)
|
||||
continue
|
||||
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/panther(J))
|
||||
num_spawned++
|
||||
|
||||
//create snake spawners
|
||||
num_spawned = 0
|
||||
max = rand(6,12)
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !istype(J) || !J.bushes_spawn)
|
||||
continue
|
||||
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/snake(J))
|
||||
num_spawned++
|
||||
|
||||
//create parrot spawners
|
||||
num_spawned = 0
|
||||
max = rand(3,6)
|
||||
while(num_spawned < max)
|
||||
var/turf/unsimulated/jungle/J = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), src.z)
|
||||
if(!J || !istype(J) || !J.bushes_spawn)
|
||||
continue
|
||||
animal_spawners.Add(new /obj/effect/landmark/animal_spawner/parrot(J))
|
||||
num_spawned++
|
||||
|
||||
#undef PATH_SPREAD_CHANCE_START
|
||||
#undef PATH_SPREAD_CHANCE_LOSS_UPPER
|
||||
#undef PATH_SPREAD_CHANCE_LOSS_LOWER
|
||||
|
||||
#undef RIVER_SPREAD_CHANCE_START
|
||||
#undef RIVER_SPREAD_CHANCE_LOSS_UPPER
|
||||
#undef RIVER_SPREAD_CHANCE_LOSS_LOWER
|
||||
|
||||
#undef RANDOM_UPPER_X
|
||||
#undef RANDOM_UPPER_Y
|
||||
|
||||
#undef RANDOM_LOWER_X
|
||||
#undef RANDOM_LOWER_Y
|
||||
BIN
code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi
Normal file
BIN
code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
158
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm
Normal file
158
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm
Normal file
@@ -0,0 +1,158 @@
|
||||
|
||||
//spawns one of the specified animal type
|
||||
/obj/effect/landmark/animal_spawner
|
||||
icon_state = "x3"
|
||||
var/spawn_type
|
||||
var/mob/living/spawned_animal
|
||||
invisibility = 101
|
||||
|
||||
/obj/effect/landmark/animal_spawner/New()
|
||||
if(!spawn_type)
|
||||
var/new_type = pick(typesof(/obj/effect/landmark/animal_spawner) - /obj/effect/landmark/animal_spawner)
|
||||
new new_type(get_turf(src))
|
||||
del(src)
|
||||
|
||||
processing_objects.Add(src)
|
||||
spawned_animal = new spawn_type(get_turf(src))
|
||||
|
||||
/obj/effect/landmark/animal_spawner/process()
|
||||
//if any of our animals are killed, spawn new ones
|
||||
if(!spawned_animal || spawned_animal.stat == DEAD)
|
||||
spawned_animal = new spawn_type(src)
|
||||
//after a random timeout, and in a random position (6-30 seconds)
|
||||
spawn(rand(1200,2400))
|
||||
spawned_animal.loc = locate(src.x + rand(-12,12), src.y + rand(-12,12), src.z)
|
||||
|
||||
/obj/effect/landmark/animal_spawner/Del()
|
||||
processing_objects.Remove(src)
|
||||
|
||||
/obj/effect/landmark/animal_spawner/panther
|
||||
name = "panther spawner"
|
||||
spawn_type = /mob/living/simple_animal/hostile/panther
|
||||
|
||||
/obj/effect/landmark/animal_spawner/parrot
|
||||
name = "parrot spawner"
|
||||
spawn_type = /mob/living/simple_animal/parrot
|
||||
|
||||
/obj/effect/landmark/animal_spawner/monkey
|
||||
name = "monkey spawner"
|
||||
spawn_type = /mob/living/carbon/monkey
|
||||
|
||||
/obj/effect/landmark/animal_spawner/snake
|
||||
name = "snake spawner"
|
||||
spawn_type = /mob/living/simple_animal/hostile/snake
|
||||
|
||||
|
||||
//*********//
|
||||
// Panther //
|
||||
//*********//
|
||||
|
||||
/mob/living/simple_animal/hostile/panther
|
||||
name = "panther"
|
||||
desc = "A long sleek, black cat with sharp teeth and claws."
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "panther"
|
||||
icon_living = "panther"
|
||||
icon_dead = "panther_dead"
|
||||
icon_gib = "panther_dead"
|
||||
speak_chance = 0
|
||||
turns_per_move = 3
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
harm_intent_damage = 8
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
|
||||
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
|
||||
var/stalk_tick_delay = 3
|
||||
|
||||
/mob/living/simple_animal/hostile/panther/ListTargets()
|
||||
var/list/targets = list()
|
||||
for(var/mob/living/carbon/human/H in view(src, 10))
|
||||
targets += H
|
||||
return targets
|
||||
|
||||
/mob/living/simple_animal/hostile/panther/FindTarget()
|
||||
. = ..()
|
||||
if(.)
|
||||
emote("nashes at [.]")
|
||||
|
||||
/mob/living/simple_animal/hostile/panther/AttackingTarget()
|
||||
. =..()
|
||||
var/mob/living/L = .
|
||||
if(istype(L))
|
||||
if(prob(15))
|
||||
L.Weaken(3)
|
||||
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/panther/AttackTarget()
|
||||
..()
|
||||
if(stance == HOSTILE_STANCE_ATTACKING && get_dist(src, target_mob))
|
||||
stalk_tick_delay -= 1
|
||||
if(stalk_tick_delay <= 0)
|
||||
src.loc = get_step_towards(src, target_mob)
|
||||
stalk_tick_delay = 3
|
||||
|
||||
//*******//
|
||||
// Snake //
|
||||
//*******//
|
||||
|
||||
/mob/living/simple_animal/hostile/snake
|
||||
name = "snake"
|
||||
desc = "A sinuously coiled, venomous looking reptile."
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "snake"
|
||||
icon_living = "snake"
|
||||
icon_dead = "snake_dead"
|
||||
icon_gib = "snake_dead"
|
||||
speak_chance = 0
|
||||
turns_per_move = 1
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
|
||||
harm_intent_damage = 2
|
||||
melee_damage_lower = 3
|
||||
melee_damage_upper = 10
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
|
||||
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
|
||||
var/stalk_tick_delay = 3
|
||||
|
||||
/mob/living/simple_animal/hostile/snake/ListTargets()
|
||||
var/list/targets = list()
|
||||
for(var/mob/living/carbon/human/H in view(src, 10))
|
||||
targets += H
|
||||
return targets
|
||||
|
||||
/mob/living/simple_animal/hostile/snake/FindTarget()
|
||||
. = ..()
|
||||
if(.)
|
||||
emote("hisses wickedly")
|
||||
|
||||
/mob/living/simple_animal/hostile/snake/AttackingTarget()
|
||||
. =..()
|
||||
var/mob/living/L = .
|
||||
if(istype(L))
|
||||
L.apply_damage(rand(3,12), TOX)
|
||||
|
||||
/mob/living/simple_animal/hostile/snake/AttackTarget()
|
||||
..()
|
||||
if(stance == HOSTILE_STANCE_ATTACKING && get_dist(src, target_mob))
|
||||
stalk_tick_delay -= 1
|
||||
if(stalk_tick_delay <= 0)
|
||||
src.loc = get_step_towards(src, target_mob)
|
||||
stalk_tick_delay = 3
|
||||
120
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm
Normal file
120
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_plants.dm
Normal file
@@ -0,0 +1,120 @@
|
||||
//*********************//
|
||||
// Generic undergrowth //
|
||||
//*********************//
|
||||
|
||||
/obj/structure/bush
|
||||
name = "foliage"
|
||||
desc = "Pretty thick scrub, it'll take something sharp and a lot of determination to clear away."
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "bush1"
|
||||
density = 1
|
||||
anchored = 1
|
||||
layer = 3.2
|
||||
var/indestructable = 0
|
||||
var/stump = 0
|
||||
|
||||
/obj/structure/bush/New()
|
||||
if(prob(20))
|
||||
opacity = 1
|
||||
|
||||
/obj/structure/bush/Bumped(M as mob)
|
||||
if (istype(M, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/A = M
|
||||
A.loc = get_turf(src)
|
||||
else if (istype(M, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/A = M
|
||||
A.loc = get_turf(src)
|
||||
|
||||
/obj/structure/bush/attackby(var/obj/I as obj, var/mob/user as mob)
|
||||
//hatchets can clear away undergrowth
|
||||
if(istype(I, /obj/item/weapon/hatchet) && !stump)
|
||||
if(indestructable)
|
||||
//this bush marks the edge of the map, you can't destroy it
|
||||
user << "\red You flail away at the undergrowth, but it's too thick here."
|
||||
else
|
||||
user.visible_message("\red <b>[user] begins clearing away [src].</b>","\red <b>You begin clearing away [src].</b>")
|
||||
spawn(rand(15,30))
|
||||
if(get_dist(user,src) < 2)
|
||||
user << "\blue You clear away [src]."
|
||||
var/obj/item/stack/sheet/wood/W = new(src.loc)
|
||||
W.amount = rand(3,15)
|
||||
if(prob(50))
|
||||
icon_state = "stump[rand(1,2)]"
|
||||
name = "cleared foliage"
|
||||
desc = "There used to be dense undergrowth here."
|
||||
density = 0
|
||||
stump = 1
|
||||
pixel_x = rand(-6,6)
|
||||
pixel_y = rand(-6,6)
|
||||
else
|
||||
del(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
//*******************************//
|
||||
// Strange, fruit-bearing plants //
|
||||
//*******************************//
|
||||
|
||||
var/list/fruit_icon_states = list("badrecipe","kudzupod","reishi","lime","grapes","boiledrorocore","chocolateegg")
|
||||
var/list/reagent_effects = list("toxin","anti_toxin","stoxin","space_drugs","mindbreaker","zombiepowder","impedrezene")
|
||||
var/jungle_plants_init = 0
|
||||
|
||||
/proc/init_jungle_plants()
|
||||
jungle_plants_init = 1
|
||||
fruit_icon_states = shuffle(fruit_icon_states)
|
||||
reagent_effects = shuffle(reagent_effects)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit
|
||||
seed = ""
|
||||
name = "jungle fruit"
|
||||
desc = "It smells weird and looks off."
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "orange"
|
||||
potency = 1
|
||||
|
||||
/obj/structure/jungle_plant
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "plant1"
|
||||
desc = "Looks like some of that fruit might be edible."
|
||||
var/fruits_left = 3
|
||||
var/fruit_type = -1
|
||||
var/icon/fruit_overlay
|
||||
var/plant_strength = 1
|
||||
var/fruit_r
|
||||
var/fruit_g
|
||||
var/fruit_b
|
||||
|
||||
|
||||
/obj/structure/jungle_plant/New()
|
||||
if(!jungle_plants_init)
|
||||
init_jungle_plants()
|
||||
|
||||
fruit_type = rand(1,7)
|
||||
icon_state = "plant[fruit_type]"
|
||||
fruits_left = rand(1,5)
|
||||
fruit_overlay = icon('jungle.dmi',"fruit[fruits_left]")
|
||||
fruit_r = 255 - fruit_type * 36
|
||||
fruit_g = rand(1,255)
|
||||
fruit_b = fruit_type * 36
|
||||
fruit_overlay.Blend(rgb(fruit_r, fruit_g, fruit_b), ICON_ADD)
|
||||
overlays += fruit_overlay
|
||||
plant_strength = rand(20,200)
|
||||
|
||||
/obj/structure/jungle_plant/attack_hand(var/mob/user as mob)
|
||||
if(fruits_left > 0)
|
||||
fruits_left--
|
||||
user << "\blue You pick a fruit off [src]."
|
||||
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/jungle_fruit/J = new (src.loc)
|
||||
J.potency = plant_strength
|
||||
J.icon_state = fruit_icon_states[fruit_type]
|
||||
J.reagents.add_reagent(reagent_effects[fruit_type], 1+round((plant_strength / 20), 1))
|
||||
J.bitesize = 1+round(J.reagents.total_volume / 2, 1)
|
||||
J.attack_hand(user)
|
||||
|
||||
overlays -= fruit_overlay
|
||||
fruit_overlay = icon('jungle.dmi',"fruit[fruits_left]")
|
||||
fruit_overlay.Blend(rgb(fruit_r, fruit_g, fruit_b), ICON_ADD)
|
||||
overlays += fruit_overlay
|
||||
else
|
||||
user << "\red There are no fruit left on [src]."
|
||||
401
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm
Normal file
401
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm
Normal file
@@ -0,0 +1,401 @@
|
||||
//randomly generated temples, indiana jones style (minus the cultists, probably)
|
||||
|
||||
/area/jungle/temple_one
|
||||
name = "temple"
|
||||
lighting_use_dynamic = 1
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "temple1"
|
||||
|
||||
/area/jungle/temple_two
|
||||
name = "temple"
|
||||
lighting_use_dynamic = 1
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "temple2"
|
||||
|
||||
/area/jungle/temple_three
|
||||
name = "temple"
|
||||
lighting_use_dynamic = 1
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "temple3"
|
||||
|
||||
/area/jungle/temple_four
|
||||
name = "temple"
|
||||
lighting_use_dynamic = 1
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "temple4"
|
||||
|
||||
/area/jungle/temple_five
|
||||
name = "temple"
|
||||
lighting_use_dynamic = 1
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "temple5"
|
||||
|
||||
/area/jungle/temple_six
|
||||
name = "temple"
|
||||
lighting_use_dynamic = 1
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "temple6"
|
||||
|
||||
/obj/effect/landmark/door_spawner
|
||||
name = "door spawner"
|
||||
|
||||
//******//
|
||||
// Loot //
|
||||
//******//
|
||||
|
||||
/obj/effect/landmark/glowshroom_spawn
|
||||
icon_state = "x3"
|
||||
invisibility = 101
|
||||
New()
|
||||
if(prob(10))
|
||||
new /obj/effect/glowshroom(src.loc)
|
||||
del(src)
|
||||
|
||||
/obj/effect/landmark/loot_spawn
|
||||
name = "loot spawner"
|
||||
icon_state = "grabbed1"
|
||||
var/low_probability = 0
|
||||
New()
|
||||
|
||||
switch(pick( \
|
||||
low_probability * 1000;"nothing", \
|
||||
200 - low_probability * 175;"treasure", \
|
||||
25 + low_probability * 75;"remains", \
|
||||
25 + low_probability * 75;"plants", \
|
||||
5; "blob", \
|
||||
50 + low_probability * 50;"clothes", \
|
||||
"glasses", \
|
||||
100 - low_probability * 50;"weapons", \
|
||||
100 - low_probability * 50;"spacesuit", \
|
||||
"health", \
|
||||
25 + low_probability * 75;"snacks", \
|
||||
25;"alien", \
|
||||
"lights", \
|
||||
25 - low_probability * 25;"engineering", \
|
||||
25 - low_probability * 25;"coffin", \
|
||||
25;"mimic", \
|
||||
25;"viscerator", \
|
||||
))
|
||||
if("treasure")
|
||||
var/obj/structure/closet/crate/C = new(src.loc)
|
||||
if(prob(33))
|
||||
//coins
|
||||
|
||||
var/amount = rand(2,6)
|
||||
var/list/possible_spawns = list()
|
||||
for(var/coin_type in typesof(/obj/item/weapon/coin))
|
||||
possible_spawns += coin_type
|
||||
|
||||
//no icon_state for mythril coins
|
||||
possible_spawns -= /obj/item/weapon/coin/mythril
|
||||
|
||||
var/coin_type = pick(possible_spawns)
|
||||
for(var/i=0,i<amount,i++)
|
||||
new coin_type(C)
|
||||
else if(prob(50))
|
||||
//bars
|
||||
|
||||
var/amount = rand(2,6)
|
||||
var/quantity = rand(10,50)
|
||||
var/list/possible_spawns = list()
|
||||
for(var/bar_type in typesof(/obj/item/stack/sheet/mineral) - /obj/item/stack/sheet/mineral - /obj/item/stack/sheet/mineral/enruranium)
|
||||
possible_spawns += bar_type
|
||||
|
||||
var/bar_type = pick(possible_spawns)
|
||||
for(var/i=0,i<amount,i++)
|
||||
var/obj/item/stack/sheet/mineral/M = new bar_type(C)
|
||||
M.amount = quantity
|
||||
else
|
||||
//credits
|
||||
|
||||
var/amount = rand(2,6)
|
||||
var/list/possible_spawns = list()
|
||||
for(var/cash_type in typesof(/obj/item/stack/sheet/mineral))
|
||||
possible_spawns += cash_type
|
||||
|
||||
var/cash_type = pick(possible_spawns)
|
||||
for(var/i=0,i<amount,i++)
|
||||
new cash_type(C)
|
||||
if("remains")
|
||||
if(prob(50))
|
||||
new /obj/effect/decal/remains/human(src.loc)
|
||||
else
|
||||
new /obj/effect/decal/remains/xeno(src.loc)
|
||||
if("plants")
|
||||
if(prob(25))
|
||||
new /obj/effect/glowshroom(src.loc)
|
||||
else if(prob(33))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap(src.loc)
|
||||
else if(prob(50))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris(src.loc)
|
||||
if("blob")
|
||||
new /obj/effect/blob/core(src.loc)
|
||||
if("clothes")
|
||||
var/obj/structure/closet/C = new(src.loc)
|
||||
C.icon_state = "blue"
|
||||
C.icon_closed = "blue"
|
||||
if(prob(33))
|
||||
new /obj/item/clothing/under/rainbow(C)
|
||||
new /obj/item/clothing/shoes/rainbow(C)
|
||||
new /obj/item/clothing/head/soft/rainbow(C)
|
||||
new /obj/item/clothing/gloves/rainbow(C)
|
||||
else if(prob(50))
|
||||
new /obj/item/clothing/under/psyche(C)
|
||||
else
|
||||
new /obj/item/clothing/under/syndicate/combat(C)
|
||||
new /obj/item/clothing/shoes/swat(C)
|
||||
new /obj/item/clothing/gloves/swat(C)
|
||||
new /obj/item/clothing/mask/balaclava(C)
|
||||
if("glasses")
|
||||
var/obj/structure/closet/C = new(src.loc)
|
||||
var/new_type = pick(
|
||||
/obj/item/clothing/glasses/material, \
|
||||
/obj/item/clothing/glasses/thermal, \
|
||||
/obj/item/clothing/glasses/meson, \
|
||||
/obj/item/clothing/glasses/night, \
|
||||
/obj/item/clothing/glasses/hud/health, \
|
||||
/obj/item/clothing/glasses/hud/health \
|
||||
)
|
||||
new new_type(C)
|
||||
if("weapons")
|
||||
var/obj/structure/closet/crate/secure/weapon/C = new(src.loc)
|
||||
var/new_type = pick(
|
||||
200; /obj/item/weapon/hatchet, \
|
||||
/obj/item/weapon/gun/projectile/pistol, \
|
||||
/obj/item/weapon/gun/projectile/deagle, \
|
||||
/obj/item/weapon/gun/projectile/russian, \
|
||||
)
|
||||
new new_type(C)
|
||||
if("spacesuit")
|
||||
var/obj/structure/closet/syndicate/C = new(src.loc)
|
||||
if(prob(25))
|
||||
new /obj/item/clothing/suit/space/syndicate/black(C)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black(C)
|
||||
new /obj/item/weapon/tank/oxygen/red(C)
|
||||
new /obj/item/clothing/mask/breath(C)
|
||||
else if(prob(33))
|
||||
new /obj/item/clothing/suit/space/syndicate/blue(C)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/blue(C)
|
||||
new /obj/item/weapon/tank/oxygen/red(C)
|
||||
new /obj/item/clothing/mask/breath(C)
|
||||
else if(prob(50))
|
||||
new /obj/item/clothing/suit/space/syndicate/green(C)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/green(C)
|
||||
new /obj/item/weapon/tank/oxygen/red(C)
|
||||
new /obj/item/clothing/mask/breath(C)
|
||||
else
|
||||
new /obj/item/clothing/suit/space/syndicate/orange(C)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/orange(C)
|
||||
new /obj/item/weapon/tank/oxygen/red(C)
|
||||
new /obj/item/clothing/mask/breath(C)
|
||||
if("health")
|
||||
//hopefully won't be necessary, but there were an awful lot of traps to get through...
|
||||
var/obj/structure/closet/crate/medical/C = new(src.loc)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/firstaid/regular(C)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/firstaid/fire(C)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/firstaid/o2(C)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/firstaid/toxin(C)
|
||||
if("snacks")
|
||||
//you're come so far, you must be in need of refreshment
|
||||
var/obj/structure/closet/crate/freezer/C = new(src.loc)
|
||||
var/num = rand(2,6)
|
||||
var/new_type = pick(
|
||||
/obj/item/weapon/reagent_containers/food/drinks/beer, \
|
||||
/obj/item/weapon/reagent_containers/food/drinks/tea, \
|
||||
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen, \
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candiedapple, \
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, \
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cookie, \
|
||||
/obj/item/weapon/reagent_containers/food/snacks/faggot, \
|
||||
/obj/item/weapon/reagent_containers/food/snacks/plump_pie, \
|
||||
)
|
||||
for(var/i=0,i<num,i++)
|
||||
new new_type(C)
|
||||
if("alien")
|
||||
//ancient aliens
|
||||
var/obj/structure/closet/acloset/C = new(src.loc)
|
||||
if(prob(33))
|
||||
//facehuggers
|
||||
var/num = rand(1,3)
|
||||
for(var/i=0,i<num,i++)
|
||||
new /obj/item/clothing/mask/facehugger(C)
|
||||
/*else if(prob(50))
|
||||
//something else very much alive and angry
|
||||
var/spawn_type = pick(/mob/living/simple_animal/hostile/alien, /mob/living/simple_animal/hostile/alien/drone, /mob/living/simple_animal/hostile/alien/sentinel)
|
||||
new spawn_type(C)*/
|
||||
|
||||
//33% chance of nothing
|
||||
|
||||
if("lights")
|
||||
//flares, candles, matches
|
||||
var/obj/structure/closet/crate/secure/gear/C = new(src.loc)
|
||||
var/num = rand(2,6)
|
||||
for(var/i=0,i<num,i++)
|
||||
var/spawn_type = pick(/obj/item/device/flashlight/flare, /obj/item/trash/candle, /obj/item/candle/, /obj/item/weapon/storage/matchbox)
|
||||
new spawn_type(C)
|
||||
if("engineering")
|
||||
var/obj/structure/closet/crate/secure/gear/C = new(src.loc)
|
||||
|
||||
//chance to have any combination of up to two electrical/mechanical toolboxes and one cell
|
||||
if(prob(33))
|
||||
new /obj/item/weapon/storage/toolbox/electrical(C)
|
||||
else if(prob(50))
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(C)
|
||||
|
||||
if(prob(33))
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(C)
|
||||
else if(prob(50))
|
||||
new /obj/item/weapon/storage/toolbox/electrical(C)
|
||||
|
||||
if(prob(25))
|
||||
new /obj/item/weapon/cell(C)
|
||||
|
||||
if("coffin")
|
||||
new /obj/structure/closet/coffin(src.loc)
|
||||
if(prob(33))
|
||||
new /obj/effect/decal/remains/human(src)
|
||||
else if(prob(50))
|
||||
new /obj/effect/decal/remains/xeno(src)
|
||||
/*if("mimic")
|
||||
//a guardian of the tomb!
|
||||
new /mob/living/simple_animal/hostile/mimic/crate(src.loc)*/
|
||||
if("viscerator")
|
||||
//more tomb guardians!
|
||||
var/num = rand(1,3)
|
||||
var/obj/structure/closet/crate/secure/gear/C = new(src.loc)
|
||||
for(var/i=0,i<num,i++)
|
||||
new /mob/living/simple_animal/hostile/viscerator(C)
|
||||
|
||||
del(src)
|
||||
|
||||
/obj/effect/landmark/loot_spawn/low
|
||||
name = "low prob loot spawner"
|
||||
icon_state = "grabbed"
|
||||
low_probability = 1
|
||||
|
||||
//********//
|
||||
// Traps! //
|
||||
//********//
|
||||
|
||||
/obj/effect/step_trigger/trap
|
||||
name = "trap"
|
||||
icon = 'code/workinprogress/cael_aislinn/jungle/jungle.dmi'
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "trap"
|
||||
var/trap_type
|
||||
|
||||
New()
|
||||
trap_type = pick(50;"thrower","sawburst","poison_dart","flame_burst",10;"plasma_gas",5;"n2_gas")
|
||||
if( (trap_type == "plasma_gas" || trap_type == "n2_gas") && prob(10))
|
||||
new /obj/effect/glowshroom(src.loc)
|
||||
|
||||
//hint that this tile is dangerous
|
||||
if(prob(90))
|
||||
var/turf/T = get_turf(src)
|
||||
T.desc = pick("There is a faint sheen of moisture over the top.","It looks a little unstable.","Something doesn't seem right.")
|
||||
|
||||
/obj/effect/step_trigger/trap/Trigger(var/atom/A)
|
||||
var/mob/living/M = A
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
switch(trap_type)
|
||||
if("sawburst")
|
||||
M << "\red <b>A sawblade shoots out of the ground and strikes you!</b>"
|
||||
M.apply_damage(rand(5,10), BRUTE)
|
||||
|
||||
var/atom/myloc = src.loc
|
||||
var/image/flicker = image('jungle.dmi',"sawblade")
|
||||
myloc.overlays += flicker
|
||||
spawn(8)
|
||||
myloc.overlays -= flicker
|
||||
del(flicker)
|
||||
//flick("sawblade",src)
|
||||
if("poison_dart")
|
||||
M << "\red <b>You feel something small and sharp strike you!</b>"
|
||||
M.apply_damage(rand(5,10), TOX)
|
||||
|
||||
var/atom/myloc = src.loc
|
||||
var/image/flicker = image('jungle.dmi',"dart[rand(1,3)]")
|
||||
myloc.overlays += flicker
|
||||
spawn(8)
|
||||
myloc.overlays -= flicker
|
||||
del(flicker)
|
||||
//flick("dart[rand(1,3)]",src)
|
||||
if("flame_burst")
|
||||
M << "\red <b>A jet of fire comes out of nowhere!</b>"
|
||||
M.apply_damage(rand(5,10), BURN)
|
||||
|
||||
var/atom/myloc = src.loc
|
||||
var/image/flicker = image('jungle.dmi',"flameburst")
|
||||
myloc.overlays += flicker
|
||||
spawn(8)
|
||||
myloc.overlays -= flicker
|
||||
del flicker
|
||||
//flick("flameburst",src)
|
||||
if("plasma_gas")
|
||||
//spawn a bunch of plasma
|
||||
if("n2_gas")
|
||||
//spawn a bunch of sleeping gas
|
||||
if("thrower")
|
||||
//edited version of obj/effect/step_trigger/thrower
|
||||
var/throw_dir = pick(1,2,4,8)
|
||||
M.visible_message("\red <b>The floor under [M] suddenly tips upward!</b>","\red <b>The floor tips upward under you!</b>")
|
||||
|
||||
var/atom/myloc = src.loc
|
||||
var/image/flicker = image('jungle.dmi',"throw[throw_dir]")
|
||||
myloc.overlays += flicker
|
||||
var/turf/my_turf = get_turf(loc)
|
||||
if(!my_turf.density)
|
||||
my_turf.density = 1
|
||||
spawn(8)
|
||||
my_turf.density = 0
|
||||
spawn(8)
|
||||
myloc.overlays -= flicker
|
||||
del(flicker)
|
||||
|
||||
var/dist = rand(1,5)
|
||||
var/curtiles = 0
|
||||
while(M)
|
||||
if(curtiles >= dist)
|
||||
break
|
||||
if(M.z != src.z)
|
||||
break
|
||||
|
||||
curtiles++
|
||||
sleep(1)
|
||||
|
||||
var/predir = M.dir
|
||||
step(M, throw_dir)
|
||||
M.dir = predir
|
||||
|
||||
//gives turf a different description, to try and trick players
|
||||
/obj/effect/step_trigger/trap/fake
|
||||
icon_state = "faketrap"
|
||||
name = "fake trap"
|
||||
|
||||
New()
|
||||
if(prob(10))
|
||||
new /obj/effect/glowshroom(src.loc)
|
||||
if(prob(90))
|
||||
var/turf/T = get_turf(src)
|
||||
T.desc = pick("It looks a little dustier than the surrounding tiles.","It is somewhat ornate.","It looks a little darker than the surrounding tiles.")
|
||||
del(src)
|
||||
|
||||
//50% chance of being a trap
|
||||
/obj/effect/step_trigger/trap/fifty
|
||||
icon_state = "trap"
|
||||
name = "fifty fifty trap"
|
||||
icon_state = "fiftytrap"
|
||||
|
||||
New()
|
||||
if(prob(50))
|
||||
..()
|
||||
else
|
||||
if(prob(10))
|
||||
new /obj/effect/glowshroom(src.loc)
|
||||
del(src)
|
||||
91
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_tribe.dm
Normal file
91
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_tribe.dm
Normal file
@@ -0,0 +1,91 @@
|
||||
|
||||
|
||||
/obj/item/projectile/jungle_spear
|
||||
damage = 10
|
||||
damage_type = TOX
|
||||
icon_state = "bullet"
|
||||
|
||||
/obj/effect/jungle_tribe_spawn
|
||||
name = "campfire"
|
||||
desc = "Looks cosy, in an alien sort of way."
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "campfire"
|
||||
anchored = 1
|
||||
var/list/tribesmen = list()
|
||||
var/list/enemy_players = list()
|
||||
var/tribe_type = 1
|
||||
|
||||
/obj/effect/jungle_tribe_spawn/New()
|
||||
processing_objects.Add(src)
|
||||
tribe_type = rand(1,5)
|
||||
|
||||
var/num_tribesmen = rand(3,6)
|
||||
for(var/i=0,i<num_tribesmen,i++)
|
||||
var/mob/living/simple_animal/hostile/tribesman/T = new(src.loc)
|
||||
T.my_type = tribe_type
|
||||
T.x += rand(-6,6)
|
||||
T.y += rand(-6,6)
|
||||
tribesmen += T
|
||||
|
||||
/obj/effect/jungle_tribe_spawn/Del()
|
||||
processing_objects.Remove(src)
|
||||
|
||||
/obj/effect/jungle_tribe_spawn/process()
|
||||
set background = 1
|
||||
for(var/mob/living/simple_animal/hostile/tribesman/T in tribesmen)
|
||||
if(T.stat == DEAD)
|
||||
tribesmen.Remove(T)
|
||||
spawn(rand(50,300))
|
||||
var/mob/living/simple_animal/hostile/tribesman/B = new(src.loc)
|
||||
B.my_type = tribe_type
|
||||
B.x += rand(-4,4)
|
||||
B.y += rand(-4,4)
|
||||
tribesmen += B
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/tribesman
|
||||
name = "tribesman"
|
||||
desc = "A noble savage, doesn't seem to know what to make of you."
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "native1"
|
||||
icon_living = "native1"
|
||||
icon_dead = "native1_dead"
|
||||
speak_chance = 25
|
||||
speak = list("Rong a'hu dong'a sik?","Ahi set mep'a teth.","Ohen nek'ti ep esi.")
|
||||
speak_emote = list("chatters")
|
||||
emote_hear = list("chatters to themselves","chatters away at something","whistles")
|
||||
emote_see = list("bends down to examine something")
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
turns_per_move = 1
|
||||
stop_automated_movement_when_pulled = 0
|
||||
var/my_type = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/tribesman/New()
|
||||
if(prob(33))
|
||||
ranged = 1
|
||||
|
||||
spawn(8)
|
||||
icon_state = "native[my_type]"
|
||||
icon_living = "native[my_type]"
|
||||
icon_dead = "native[my_type]_dead"
|
||||
|
||||
/mob/living/simple_animal/hostile/tribesman/ListTargets()
|
||||
var/list/targets = list()
|
||||
for(var/mob/living/simple_animal/hostile/H in view(src, 10))
|
||||
if(istype(H, /mob/living/simple_animal/hostile/tribesman))
|
||||
continue
|
||||
targets += H
|
||||
return targets
|
||||
|
||||
/mob/living/simple_animal/hostile/tribesman/FindTarget()
|
||||
. = ..()
|
||||
if(.)
|
||||
emote("waves a spear at [.]")
|
||||
|
||||
/mob/living/simple_animal/hostile/tribesman/OpenFire(target_mob)
|
||||
visible_message("\red <b>[src]</b> throws a spear at [target_mob]!", 1)
|
||||
flick(src, "native[my_type]_act")
|
||||
|
||||
var/tturf = get_turf(target_mob)
|
||||
Shoot(tturf, src.loc, src)
|
||||
178
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm
Normal file
178
code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm
Normal file
@@ -0,0 +1,178 @@
|
||||
|
||||
/turf/unsimulated/jungle
|
||||
var/bushes_spawn = 1
|
||||
var/plants_spawn = 1
|
||||
name = "wet grass"
|
||||
desc = "Thick, long wet grass"
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "grass1"
|
||||
var/icon_spawn_state = "grass1"
|
||||
luminosity = 3
|
||||
|
||||
New()
|
||||
icon_state = icon_spawn_state
|
||||
|
||||
if(plants_spawn && prob(40))
|
||||
if(prob(90))
|
||||
var/image/I
|
||||
if(prob(35))
|
||||
I = image('jungle.dmi',"plant[rand(1,7)]")
|
||||
else
|
||||
if(prob(30))
|
||||
I = image('icons/obj/flora/ausflora.dmi',"reedbush_[rand(1,4)]")
|
||||
else if(prob(33))
|
||||
I = image('icons/obj/flora/ausflora.dmi',"leafybush_[rand(1,3)]")
|
||||
else if(prob(50))
|
||||
I = image('icons/obj/flora/ausflora.dmi',"fernybush_[rand(1,3)]")
|
||||
else
|
||||
I = image('icons/obj/flora/ausflora.dmi',"stalkybush_[rand(1,3)]")
|
||||
I.pixel_x = rand(-6,6)
|
||||
I.pixel_y = rand(-6,6)
|
||||
overlays += I
|
||||
else
|
||||
var/obj/structure/jungle_plant/J = new(src)
|
||||
J.pixel_x = rand(-6,6)
|
||||
J.pixel_y = rand(-6,6)
|
||||
if(bushes_spawn && prob(90))
|
||||
new /obj/structure/bush(src)
|
||||
|
||||
/turf/unsimulated/jungle/clear
|
||||
bushes_spawn = 0
|
||||
plants_spawn = 0
|
||||
icon_state = "grass_clear"
|
||||
icon_spawn_state = "grass3"
|
||||
|
||||
/turf/unsimulated/jungle/path
|
||||
bushes_spawn = 0
|
||||
name = "wet grass"
|
||||
desc = "thick, long wet grass"
|
||||
icon = 'jungle.dmi'
|
||||
icon_state = "grass_path"
|
||||
icon_spawn_state = "grass2"
|
||||
|
||||
New()
|
||||
..()
|
||||
for(var/obj/structure/bush/B in src)
|
||||
del B
|
||||
|
||||
/turf/unsimulated/jungle/proc/Spread(var/probability, var/prob_loss = 50)
|
||||
if(probability <= 0)
|
||||
return
|
||||
|
||||
//world << "\blue Spread([probability])"
|
||||
for(var/turf/unsimulated/jungle/J in orange(1, src))
|
||||
if(!J.bushes_spawn)
|
||||
continue
|
||||
|
||||
var/turf/unsimulated/jungle/P = null
|
||||
if(J.type == src.type)
|
||||
P = J
|
||||
else
|
||||
P = new src.type(J)
|
||||
|
||||
if(P && prob(probability))
|
||||
P.Spread(probability - prob_loss)
|
||||
|
||||
/turf/unsimulated/jungle/impenetrable
|
||||
bushes_spawn = 0
|
||||
icon_state = "grass_impenetrable"
|
||||
icon_spawn_state = "grass1"
|
||||
New()
|
||||
..()
|
||||
var/obj/structure/bush/B = new(src)
|
||||
B.indestructable = 1
|
||||
|
||||
//copy paste from asteroid mineral turfs
|
||||
/turf/unsimulated/jungle/rock
|
||||
bushes_spawn = 0
|
||||
plants_spawn = 0
|
||||
density = 1
|
||||
name = "rock wall"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "rock"
|
||||
icon_spawn_state = "rock"
|
||||
|
||||
/turf/unsimulated/jungle/rock/New()
|
||||
spawn(1)
|
||||
var/turf/T
|
||||
if(!istype(get_step(src, NORTH), /turf/unsimulated/jungle/rock) && !istype(get_step(src, NORTH), /turf/unsimulated/wall))
|
||||
T = get_step(src, NORTH)
|
||||
if (T)
|
||||
T.overlays += image('icons/turf/walls.dmi', "rock_side_s")
|
||||
if(!istype(get_step(src, SOUTH), /turf/unsimulated/jungle/rock) && !istype(get_step(src, SOUTH), /turf/unsimulated/wall))
|
||||
T = get_step(src, SOUTH)
|
||||
if (T)
|
||||
T.overlays += image('icons/turf/walls.dmi', "rock_side_n", layer=6)
|
||||
if(!istype(get_step(src, EAST), /turf/unsimulated/jungle/rock) && !istype(get_step(src, EAST), /turf/unsimulated/wall))
|
||||
T = get_step(src, EAST)
|
||||
if (T)
|
||||
T.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=6)
|
||||
if(!istype(get_step(src, WEST), /turf/unsimulated/jungle/rock) && !istype(get_step(src, WEST), /turf/unsimulated/wall))
|
||||
T = get_step(src, WEST)
|
||||
if (T)
|
||||
T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=6)
|
||||
|
||||
/turf/unsimulated/jungle/water
|
||||
bushes_spawn = 0
|
||||
name = "murky water"
|
||||
desc = "thick, murky water"
|
||||
icon = 'icons/misc/beach.dmi'
|
||||
icon_state = "water"
|
||||
icon_spawn_state = "water"
|
||||
|
||||
/turf/unsimulated/jungle/water/New()
|
||||
..()
|
||||
for(var/obj/structure/bush/B in src)
|
||||
del(B)
|
||||
|
||||
/turf/unsimulated/jungle/water/Entered(atom/movable/O)
|
||||
..()
|
||||
if(istype(O, /mob/living/))
|
||||
var/mob/living/M = O
|
||||
//slip in the murky water if we try to run through it
|
||||
if(prob(10 + (M.m_intent == "run" ? 40 : 0)))
|
||||
M << pick("\blue You slip on something slimy.","\blue You fall over into the murk.")
|
||||
M.Stun(2)
|
||||
M.Weaken(1)
|
||||
|
||||
//piranhas - 25% chance to be an omnipresent risk, although they do practically no damage
|
||||
if(prob(25))
|
||||
M << "\blue You feel something slithering around your legs."
|
||||
if(prob(50))
|
||||
spawn(rand(25,50))
|
||||
var/turf/T = get_turf(M)
|
||||
if(istype(T, /turf/unsimulated/jungle/water))
|
||||
M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!")
|
||||
M.apply_damage(rand(0,1), BRUTE)
|
||||
if(prob(50))
|
||||
spawn(rand(25,50))
|
||||
var/turf/T = get_turf(M)
|
||||
if(istype(T, /turf/unsimulated/jungle/water))
|
||||
M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!")
|
||||
M.apply_damage(rand(0,1), BRUTE)
|
||||
if(prob(50))
|
||||
spawn(rand(25,50))
|
||||
var/turf/T = get_turf(M)
|
||||
if(istype(T, /turf/unsimulated/jungle/water))
|
||||
M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!")
|
||||
M.apply_damage(rand(0,1), BRUTE)
|
||||
if(prob(50))
|
||||
spawn(rand(25,50))
|
||||
var/turf/T = get_turf(M)
|
||||
if(istype(T, /turf/unsimulated/jungle/water))
|
||||
M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!")
|
||||
M.apply_damage(rand(0,1), BRUTE)
|
||||
|
||||
/turf/unsimulated/jungle/water/deep
|
||||
plants_spawn = 0
|
||||
density = 1
|
||||
icon_state = "water2"
|
||||
icon_spawn_state = "water2"
|
||||
|
||||
/turf/unsimulated/jungle/temple_wall
|
||||
name = "temple wall"
|
||||
desc = ""
|
||||
density = 1
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "plasma0"
|
||||
var/mineral = "plasma"
|
||||
122
code/WorkInProgress/Cael_Aislinn/Jungle/misc_helpers.dm
Normal file
122
code/WorkInProgress/Cael_Aislinn/Jungle/misc_helpers.dm
Normal file
@@ -0,0 +1,122 @@
|
||||
//put this here because i needed specific functionality, and i wanted to avoid the hassle of getting it onto svn
|
||||
|
||||
|
||||
/area/proc/copy_turfs_to(var/area/A , var/platingRequired = 0 )
|
||||
//Takes: Area. Optional: If it should copy to areas that don't have plating
|
||||
//Returns: Nothing.
|
||||
//Notes: Attempts to move the contents of one area to another area.
|
||||
// Movement based on lower left corner. Tiles that do not fit
|
||||
// into the new area will not be moved.
|
||||
|
||||
if(!A || !src) return 0
|
||||
|
||||
var/list/turfs_src = get_area_turfs(src.type)
|
||||
var/list/turfs_trg = get_area_turfs(A.type)
|
||||
|
||||
var/src_min_x = 0
|
||||
var/src_min_y = 0
|
||||
for (var/turf/T in turfs_src)
|
||||
if(T.x < src_min_x || !src_min_x) src_min_x = T.x
|
||||
if(T.y < src_min_y || !src_min_y) src_min_y = T.y
|
||||
|
||||
var/trg_min_x = 0
|
||||
var/trg_min_y = 0
|
||||
for (var/turf/T in turfs_trg)
|
||||
if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x
|
||||
if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y
|
||||
|
||||
var/list/refined_src = new/list()
|
||||
for(var/turf/T in turfs_src)
|
||||
refined_src += T
|
||||
refined_src[T] = new/datum/coords
|
||||
var/datum/coords/C = refined_src[T]
|
||||
C.x_pos = (T.x - src_min_x)
|
||||
C.y_pos = (T.y - src_min_y)
|
||||
|
||||
var/list/refined_trg = new/list()
|
||||
for(var/turf/T in turfs_trg)
|
||||
refined_trg += T
|
||||
refined_trg[T] = new/datum/coords
|
||||
var/datum/coords/C = refined_trg[T]
|
||||
C.x_pos = (T.x - trg_min_x)
|
||||
C.y_pos = (T.y - trg_min_y)
|
||||
|
||||
var/list/toupdate = new/list()
|
||||
|
||||
var/copiedobjs = list()
|
||||
|
||||
|
||||
moving:
|
||||
for (var/turf/T in refined_src)
|
||||
var/datum/coords/C_src = refined_src[T]
|
||||
for (var/turf/B in refined_trg)
|
||||
var/datum/coords/C_trg = refined_trg[B]
|
||||
if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos)
|
||||
|
||||
var/old_dir1 = T.dir
|
||||
var/old_icon_state1 = T.icon_state
|
||||
var/old_icon1 = T.icon
|
||||
|
||||
if(platingRequired)
|
||||
if(istype(B, /turf/space))
|
||||
continue moving
|
||||
|
||||
var/turf/X = new T.type(B)
|
||||
X.dir = old_dir1
|
||||
X.icon_state = old_icon_state1
|
||||
X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
|
||||
|
||||
|
||||
var/list/mobs = new/list()
|
||||
var/list/newmobs = new/list()
|
||||
|
||||
for(var/mob/M in T)
|
||||
|
||||
if(!istype(M,/mob) || istype(M, /mob/aiEye)) continue // If we need to check for more mobs, I'll add a variable
|
||||
mobs += M
|
||||
|
||||
for(var/mob/M in mobs)
|
||||
newmobs += DuplicateObject(M , 1)
|
||||
|
||||
for(var/mob/M in newmobs)
|
||||
M.loc = X
|
||||
|
||||
|
||||
|
||||
for(var/V in T.vars)
|
||||
if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity")))
|
||||
X.vars[V] = T.vars[V]
|
||||
|
||||
// var/area/AR = X.loc
|
||||
|
||||
// if(AR.lighting_use_dynamic)
|
||||
// X.opacity = !X.opacity
|
||||
// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn
|
||||
|
||||
toupdate += X
|
||||
|
||||
refined_src -= T
|
||||
refined_trg -= B
|
||||
continue moving
|
||||
|
||||
|
||||
|
||||
|
||||
/*var/list/doors = new/list()
|
||||
|
||||
if(toupdate.len)
|
||||
for(var/turf/simulated/T1 in toupdate)
|
||||
for(var/obj/machinery/door/D2 in T1)
|
||||
doors += D2
|
||||
if(T1.parent)
|
||||
air_master.groups_to_rebuild += T1.parent
|
||||
else
|
||||
air_master.tiles_to_update += T1
|
||||
|
||||
for(var/obj/O in doors)
|
||||
O:update_nearby_tiles(1)*/
|
||||
|
||||
|
||||
|
||||
|
||||
return copiedobjs
|
||||
@@ -40,7 +40,7 @@
|
||||
/obj/item/tape/engineering
|
||||
name = "engineering tape"
|
||||
desc = "A length of engineering tape. Better not cross it."
|
||||
req_access = list(access_engine,access_atmospherics)
|
||||
req_one_access = list(access_engine,access_atmospherics)
|
||||
icon_base = "engineering"
|
||||
|
||||
/obj/item/taperoll/attack_self(mob/user as mob)
|
||||
|
||||
@@ -11,6 +11,14 @@ turf/unsimulated/desert
|
||||
turf/unsimulated/desert/New()
|
||||
icon_state = "desert[rand(0,4)]"
|
||||
|
||||
turf/simulated/wall/impassable_rock
|
||||
name = "Mountain Wall"
|
||||
|
||||
//so that you can see the impassable sections in the map editor
|
||||
icon_state = "riveted"
|
||||
New()
|
||||
icon_state = "rock"
|
||||
|
||||
/area/awaymission/labs/researchdivision
|
||||
name = "Research"
|
||||
icon_state = "away3"
|
||||
|
||||
@@ -1258,7 +1258,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
|
||||
target.custom_pain("The pain in your chest is living hell!",1)
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/chest/affected = target.get_organ("chest")
|
||||
var/datum/organ/external/chest/affected = target.get_organ(target_zone)
|
||||
|
||||
var/find_prob = 0
|
||||
if (affected.implants.len)
|
||||
@@ -1295,8 +1295,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
|
||||
if (prob(fail_prob))
|
||||
var/obj/item/weapon/implant/imp = affected.implants[1]
|
||||
user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
|
||||
playsound(imp.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
||||
spawn(25)
|
||||
imp.activate()
|
||||
if (ishuman(user))
|
||||
user:bloody_hands(target, 0)
|
||||
|
||||
Reference in New Issue
Block a user