Files
Aurora.3/code/_onclick/hud/parallax.dm
LordFowl 76372c4b15 [Ready for Review] Unapologetic Vaurca Buffs III: Revenge of the Buffs (#4885)
Implements various changes at the behest of lore-dev BygoneHero, namely:

Vaurca can now wear specially modified softsuits.
Vaurca now have their own special rigsuit a la the breacher: the combat exoskeleton. It comes with various special modules, including a boring laser that allows them to dig below themselves rapidly, a vaurca variant of the combat injector which includes phoron and k'ois paste, and a neural lattice which reduces halloss by sharing it with everyone else wearing a neural lattice.
Vaurca also have received various other currently unavailable event items, including a variant of the tactical mask that filters out nitrogen and allows the Vaurca wearing it to eat, tachyon rifles and carbines which penetrate up to three layers of walls and possess other fringe benefits, the gauss rifle which is a semi-automatic variant of the crossbow with greater power and a 6 rod magazine, the energy zweihander, commando armor and scout armor.
Introduces a general climbing mechanic. Climbing can be initiated by clicking on a wall or an open turf, and it is a percentage chance that is modified by the amount of stable/large items beneath you, and decreased by the amount of unstable/small items. Vaurca are naturally proficient and always succeed at climbing.
Changes Vaurca to see in blue-green vision. Their vision is generally brighter and reddish colors are converted to a blue-green color.
Adds the Sedantis flag, an interhive flag that celebrates the universal longing for Sedantis and is a symbol of the Vaurca diaspora.
2018-07-22 19:17:03 +03:00

270 lines
8.2 KiB
Plaintext

/*
* This file handles all parallax-related business once the parallax itself is initialized with the rest of the HUD
*/
#define PARALLAX_IMAGE_WIDTH 8
#define PARALLAX_IMAGE_TILES (PARALLAX_IMAGE_WIDTH**2)
#define GRID_WIDTH 3
#define PARALLAX_SCALED_WIDTH (PARALLAX_IMAGE_WIDTH*WORLD_ICON_SIZE)
#define PARALLAX_SCALED_GRID_WIDTH (PARALLAX_SCALED_WIDTH*GRID_WIDTH)
/obj/screen/parallax
var/base_offset_x = 0
var/base_offset_y = 0
mouse_opacity = 0
icon = 'icons/turf/space.dmi'
icon_state = "blank"
name = "space parallax"
screen_loc = "CENTER,CENTER"
blend_mode = BLEND_ADD
layer = AREA_LAYER
plane = PLANE_SPACE_PARALLAX
var/parallax_speed = 0
/obj/screen/plane_master
appearance_flags = PLANE_MASTER | NO_CLIENT_COLOR
screen_loc = "CENTER,CENTER"
/obj/screen/plane_master/parallax_master
plane = PLANE_SPACE_PARALLAX
blend_mode = BLEND_MULTIPLY
color = list(
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,0,
0,0,0,1
)
/obj/screen/plane_master/parallax_spacemaster //Turns space white, causing the parallax to only show in areas with opacity. Somehow
plane = PLANE_SPACE_BACKGROUND
color = list(
0,0,0,0,
0,0,0,0,
0,0,0,0,
1,1,1,1
)
/obj/screen/plane_master/parallax_spacemaster/New()
..()
overlays += image(icon = 'icons/mob/screen/generic.dmi', icon_state = "blank")
if(universe)
universe.convert_parallax(src)
/obj/screen/plane_master/parallax_dustmaster
plane = PLANE_SPACE_DUST
color = list(0,0,0,0)
/datum/hud/proc/update_parallax_existence()
if(!SSparallax.parallax_initialized)
return
initialize_parallax()
update_parallax()
update_parallax_values()
/datum/hud/proc/initialize_parallax()
var/client/C = mymob.client
if(!C.parallax_master)
C.parallax_master = new /obj/screen/plane_master/parallax_master
if(!C.parallax_spacemaster)
C.parallax_spacemaster = new /obj/screen/plane_master/parallax_spacemaster
if(!C.parallax_dustmaster)
C.parallax_dustmaster = new /obj/screen/plane_master/parallax_dustmaster
if(!C.parallax.len)
for(var/obj/screen/parallax/bgobj in SSparallax.parallax_icon)
var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax
parallax_layer.appearance = bgobj.appearance
parallax_layer.base_offset_x = bgobj.base_offset_x
parallax_layer.base_offset_y = bgobj.base_offset_y
parallax_layer.parallax_speed = bgobj.parallax_speed
parallax_layer.screen_loc = bgobj.screen_loc
C.parallax += parallax_layer
if(bgobj.parallax_speed)
C.parallax_movable += parallax_layer
C.screen |= C.parallax_dustmaster
/datum/hud/proc/update_parallax()
var/client/C = mymob.client
if(C.prefs.toggles_secondary & PARALLAX_SPACE)
for(var/obj/screen/parallax/bgobj in C.parallax)
C.screen |= bgobj
C.screen |= C.parallax_master
C.screen |= C.parallax_spacemaster
if(C.prefs.toggles_secondary & PARALLAX_DUST)
C.parallax_dustmaster.color = list(
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1)
else
C.parallax_dustmaster.color = list(0,0,0,0)
else
for(var/obj/screen/parallax/bgobj in C.parallax)
C.screen -= bgobj
C.screen -= C.parallax_master
C.screen -= C.parallax_spacemaster
C.parallax_dustmaster.color = list(0,0,0,0)
/datum/hud/proc/update_parallax_values()
var/client/C = mymob.client
if(!SSparallax.parallax_initialized)
return
if (C.prefs.toggles_secondary & PARALLAX_IS_STATIC)
return
//ACTUALLY MOVING THE PARALLAX
var/turf/posobj = C.eye ? C.eye:loc : C.mob:loc
if (!isturf(posobj))
posobj = get_turf(posobj)
if(!posobj || (!(locate(/turf/space) in RANGE_TURFS(C.view, posobj)) && !(locate(/turf/simulated/open) in RANGE_TURFS(C.view, posobj))))
return
if(!C.previous_turf || (C.previous_turf.z != posobj.z))
C.previous_turf = posobj
//Doing it this way prevents parallax layers from "jumping" when you change Z-Levels.
C.parallax_offset_x += posobj.x - C.previous_turf.x
C.parallax_offset_y += posobj.y - C.previous_turf.y
C.previous_turf = posobj
var/offsetx = C.parallax_offset_x * C.prefs.parallax_speed
var/offsety = C.parallax_offset_y * C.prefs.parallax_speed
for(var/thing in C.parallax_movable)
var/obj/screen/parallax/bgobj = thing
var/accumulated_offset_x = bgobj.base_offset_x - round(offsetx * bgobj.parallax_speed)
var/accumulated_offset_y = bgobj.base_offset_y - round(offsety * bgobj.parallax_speed)
if(accumulated_offset_x > PARALLAX_SCALED_WIDTH)
accumulated_offset_x -= PARALLAX_SCALED_GRID_WIDTH //3x3 grid, 15 tiles * 64 icon_size * 3 grid size
if(accumulated_offset_x < -(PARALLAX_SCALED_WIDTH*2))
accumulated_offset_x += PARALLAX_SCALED_GRID_WIDTH
if(accumulated_offset_y > PARALLAX_SCALED_WIDTH)
accumulated_offset_y -= PARALLAX_SCALED_GRID_WIDTH
if(accumulated_offset_y < -(PARALLAX_SCALED_WIDTH*2))
accumulated_offset_y += PARALLAX_SCALED_GRID_WIDTH
bgobj.screen_loc = "CENTER:[accumulated_offset_x],CENTER:[accumulated_offset_y]"
//Parallax generation code below
#define PARALLAX4_ICON_NUMBER 20
#define PARALLAX3_ICON_NUMBER 14
#define PARALLAX2_ICON_NUMBER 10
/proc/create_global_parallax_icons()
var/list/plane1 = list()
var/list/plane2 = list()
var/list/plane3 = list()
var/list/pixel_x = list()
var/list/pixel_y = list()
var/index = 1
for(var/i = 0 to (PARALLAX_IMAGE_TILES-1))
for(var/j = 1 to GRID_WIDTH**2)
plane1 += rand(1,26)
plane2 += rand(1,26)
plane3 += rand(1,26)
pixel_x += WORLD_ICON_SIZE * (i%PARALLAX_IMAGE_WIDTH)
pixel_y += WORLD_ICON_SIZE * round(i/PARALLAX_IMAGE_WIDTH)
for(var/i in 0 to ((GRID_WIDTH**2)-1))
var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax
var/list/L = list()
for(var/j in 1 to PARALLAX_IMAGE_TILES)
if(plane1[j+i*PARALLAX_IMAGE_TILES] <= PARALLAX4_ICON_NUMBER)
var/image/I = image('icons/turf/space_parallax4.dmi',"[plane1[j+i*PARALLAX_IMAGE_TILES]]")
I.pixel_x = pixel_x[j]
I.pixel_y = pixel_y[j]
L += I
parallax_layer.overlays = L
parallax_layer.parallax_speed = 0
parallax_layer.calibrate_parallax(i+1)
SSparallax.parallax_icon[index] = parallax_layer
index++
for(var/i in 0 to ((GRID_WIDTH**2)-1))
var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax
var/list/L = list()
for(var/j in 1 to PARALLAX_IMAGE_TILES)
if(plane2[j+i*PARALLAX_IMAGE_TILES] <= PARALLAX3_ICON_NUMBER)
var/image/I = image('icons/turf/space_parallax3.dmi',"[plane2[j+i*PARALLAX_IMAGE_TILES]]")
I.pixel_x = pixel_x[j]
I.pixel_y = pixel_y[j]
L += I
parallax_layer.overlays = L
parallax_layer.parallax_speed = 0.5
parallax_layer.calibrate_parallax(i+1)
SSparallax.parallax_icon[index] = parallax_layer
index++
for(var/i in 0 to ((GRID_WIDTH**2)-1))
var/obj/screen/parallax/parallax_layer = new /obj/screen/parallax
var/list/L = list()
for(var/j in 1 to PARALLAX_IMAGE_TILES)
if(plane3[j+i*PARALLAX_IMAGE_TILES] <= PARALLAX2_ICON_NUMBER)
var/image/I = image('icons/turf/space_parallax2.dmi',"[plane3[j+i*PARALLAX_IMAGE_TILES]]")
I.pixel_x = pixel_x[j]
I.pixel_y = pixel_y[j]
L += I
parallax_layer.overlays = L
parallax_layer.parallax_speed = 1
parallax_layer.calibrate_parallax(i+1)
SSparallax.parallax_icon[index] = parallax_layer
index++
SSparallax.parallax_initialized = 1
/obj/screen/parallax/proc/calibrate_parallax(var/i)
if(!i)
return
/* Placement of screen objects
1 2 3
4 5 6
7 8 9
*/
base_offset_x = -PARALLAX_IMAGE_WIDTH*WORLD_ICON_SIZE/2
base_offset_y = -PARALLAX_IMAGE_WIDTH*WORLD_ICON_SIZE/2
//TODO: switch to grid size defines... somehow
switch(i)
if(1,4,7) //1 mod grid_size
base_offset_x -= WORLD_ICON_SIZE*PARALLAX_IMAGE_WIDTH
if(3,6,9) //0 mod grid_size
base_offset_x += WORLD_ICON_SIZE*PARALLAX_IMAGE_WIDTH
switch(i)
if(1,2,3) //round(i/grid_size) = 0
base_offset_y += WORLD_ICON_SIZE*PARALLAX_IMAGE_WIDTH
if(7,8,9) //round(i/grid_size) = 2
base_offset_y -= WORLD_ICON_SIZE*PARALLAX_IMAGE_WIDTH
screen_loc = "CENTER:[base_offset_x],CENTER:[base_offset_y]"
/client/proc/cleanup_parallax_references()
parallax_dustmaster = null
parallax_master = null
parallax_spacemaster = null
LAZYCLEARLIST(parallax)
LAZYCLEARLIST(parallax_movable)
#undef GRID_WIDTH
#undef PARALLAX4_ICON_NUMBER
#undef PARALLAX3_ICON_NUMBER
#undef PARALLAX2_ICON_NUMBER
#undef PARALLAX_IMAGE_WIDTH
#undef PARALLAX_IMAGE_TILES
#undef PARALLAX_SCALED_WIDTH
#undef PARALLAX_SCALED_GRID_WIDTH