Amiga-Z Wiki

β€œModern tools for old-school communities.”

User Tools

Site Tools


faserip:buildings

This is an old revision of the document!


FASERIP Online β€” Adding & Configuring City Buildings

Last updated: February 2026 β€” v1.0

Part of the Game Master & Artist Guide

This page is a complete reference for adding, positioning, and customizing buildings on the city map. No database changes or server restarts are needed β€” buildings live entirely in game.js on the client side.


Table of Contents

How Buildings Work

Buildings are rendered entirely in the browser from a JavaScript data structure. When a player enters a zone, game.js reads the list of buildings for that zone and draws each one on the map canvas as a styled HTML element.

Because nothing is stored in the database, you can:

  • Add or remove buildings by editing game.js only
  • Test changes instantly with a browser refresh
  • Deploy to all players just by saving the file β€” no server restart needed

The file to edit is:

/var/www/html/amigaz/games/faserip/public/game.js

The CITY_BUILDINGS Object

Near the top of game.js you will find the CITY_BUILDINGS object. It contains one array per zone, each array holding the buildings for that zone:

const CITY_BUILDINGS = {
  central_city: [
    { id: 'city-hall',    name: 'City Hall',    type: 'government', x: 100, y: 80,  icon: 'πŸ›οΈ', height: 160, color: '#1a4a6b' },
    { id: 'central-bank', name: 'Central Bank', type: 'bank',       x: 320, y: 60,  icon: '🏦', height: 180, color: '#1a5c2e' },
    // ... more buildings
  ],
  warehouse_district: [
    // ... buildings
  ],
  downtown: [
    // ... buildings
  ],
  industrial_zone: [
    // ... buildings
  ],
  waterfront: [
    // ... buildings
  ]
};

To add a building, insert a new line inside the correct zone's array. To remove one, delete its line. To edit one, change its field values.


Building Fields Reference

Field Type Required Description
id string βœ… Yes Unique identifier. Lowercase, no spaces β€” use hyphens. Must be unique across ALL zones, not just within one zone.
name string βœ… Yes The display name shown in the location panel and on hover.
type string βœ… Yes Controls the description text players see. See type list below.
x number βœ… Yes Horizontal position in pixels from the left edge of the map.
y number βœ… Yes Vertical position in pixels from the top of the map. This is the TOP of the building label, not the base.
icon string βœ… Yes Any single emoji. Displayed centred on the building face.
height number βœ… Yes Building face height in pixels. Recommended range: 60–240.
color string βœ… Yes Hex color code for the building face. Dark colors work best on the night background.

ID Rules

  • Use only lowercase letters, numbers, and hyphens
  • Must be unique across every zone β€” even if two buildings have the same name
  • Good: central-bank, pier-7-warehouse, vex-lab-2
  • Bad: Central Bank, warehouse, 1 (too generic), warehouse-1 (if already used)

Color Guide

Buildings look best with dark, saturated base colors. The renderer automatically lightens the color for the roof and side faces.

Color Hex Example Good For
Dark blue-gray #1a2a4a Offices, government, police
Dark green #1a4a2a Banks, parks, hospitals
Dark red-brown #3a1a1a Villain lairs, criminal buildings
Dark purple #2a1a3a Arcane, villain, underground
Dark steel #2a2a3a Industrial, factories, warehouses
Dark warm brown #3a2a1a Warehouses, markets, old buildings
Dark teal #1a3a3a Waterfront, science, media

Map Layout and Positioning

The city map canvas is 900 px wide Γ— 520 px tall.

Two roads divide the map into four quadrants:

  • Horizontal road β€” runs across the full width at y: 220, occupying y: 220 to y: 258 (38 px tall)
  • Vertical road β€” runs the full height at x: 430, occupying x: 430 to x: 468 (38 px wide)

Buildings should be placed so they do not overlap the roads or each other.

Building Footprint

Every building occupies this space on the canvas:

  • Width: always 130 px regardless of height
  • Height: your height value (the building face) + 22 px (isometric roof cap) + 30 px (label below base)
  • Total vertical space needed: height + 52 px

So a building with height: 120 needs 172 px of vertical clearance from its y value.

Safe Margins

Leave at least 20 px between adjacent buildings horizontally and 10 px between a building's base and another building's top label.

A safe horizontal gap between buildings is 150–160 px (130 px wide + 20–30 px gap).


Quadrant Cheat Sheet

Use these coordinate ranges when placing new buildings to stay clear of roads:

Quadrant X Range Y Range Notes
Top-left 20 – 410 20 – 200 Above horizontal road, left of vertical road
Top-right 480 – 880 20 – 200 Above horizontal road, right of vertical road
Bottom-left 20 – 410 270 – 440 Below horizontal road, left of vertical road
Bottom-right 480 – 880 270 – 440 Below horizontal road, right of vertical road
Tip: A building at y: 270 with height: 140 has its label at y: 270 + 140 + 30 = 440. That fits in the bottom quadrant. A height of 160 at the same y would push the label to y: 460 β€” still fine. Height of 200 would hit y: 500 and start to clip the map edge.

Suggested Starting Positions for New Buildings

If you just want to drop a building in quickly without thinking too hard about layout, use one of these open slots. They are gaps in the default building placement across all zones:

Slot X Y Height Limit
Top-left corner 20 30 160
Top-right corner 740 30 160
Mid top-left 200 30 150
Mid top-right 580 30 150
Bottom-left corner 20 280 140
Bottom-right corner 740 280 140
Bottom-centre-left 200 280 140
Bottom-centre-right 580 280 140

Available Building Types

The type field controls the description text shown in the location panel when a player clicks the building. It also controls which description is shown in investigation results.

These types are defined in the LOCATION_DESCRIPTIONS object in game.js:

Type Description Shown to Players
government The seat of city government. Heroes come here for official sanctions and briefings.
bank A major financial institution. Frequent target for supervillain attacks.
police Law enforcement HQ. Coordinate with officers and get mission intel.
hospital Emergency medical center. Protect civilians and access healing supplies.
warehouse Old storage facility β€” popular hideout for criminals and stolen goods.
villain-lair Something sinister lurks here… A hero should proceed with caution.
criminal Clearly illegal operations. Shut it down!
commercial Shopping and entertainment. Lots of civilians to protect.
factory Industrial facility with hazardous materials. Dangerous environment.
docks Cargo shipping area. Smuggling is rampant here.
office Corporate headquarters. Business dealings β€” some above board, some not.
landmark An iconic city landmark. Worth protecting at all costs.
media Local news station. They will cover your heroic deeds β€” or your failures.
education A center of knowledge. Research villain weaknesses here.
science Advanced research facility. Unknown experiments underway.
sports City sports arena. Packed with civilians on game days.
hotel Luxury hotel. Frequently used by visiting villains as a base of operations.
transport Transportation hub. Excellent for cutting off villain escape routes.
utility City power grid. A prime target for villains wanting to plunge the city into darkness.
underground Access to the city's underground network. Danger unknown.
junkyard Salvage yard. Useful for improvised equipment β€” if you can fight off the gangs.
market Busy market district. Civilians everywhere. Collateral damage is a concern.
restaurant Dining district. Keep innocent bystanders out of harm's way.
residential Apartment buildings. Civilians live here β€” protect them at all costs.
plaza Open public space. Great for large-scale battles away from buildings.

Adding a Custom Type

If none of the existing types fit your building, add your own in two steps.

Step 1 β€” Add your type to LOCATION_DESCRIPTIONS near the top of game.js:

const LOCATION_DESCRIPTIONS = {
  // ... existing entries ...
  'casino':    'Glittering lights hide a web of criminal connections. The house always wins.',
  'subway':    'Underground transit hub. Fast travel β€” and a perfect ambush point.',
  'safehouse': 'A secret hero refuge. Rest, regroup, and plan your next move here.',
};

Step 2 β€” Use your new type in a building entry:

{ id: 'lucky-casino', name: "Lucky's Casino", type: 'casino', x: 480, y: 30, icon: '🎰', height: 130, color: '#2a1a0a' }

That's all. The description will automatically appear in the location panel when players click the building.


Step-by-Step Example

This example adds three new buildings to the Warehouse District: a pawn shop, a hero safe house, and a villain underground HQ.

1. Open the file

nano /var/www/html/amigaz/games/faserip/public/game.js

2. Find the warehouse_district array

Use Ctrl+W in nano to search for warehouse_district.

3. Add the new buildings

warehouse_district: [
  { id: 'warehouse-1',    name: 'Old Warehouse',     type: 'warehouse',    x: 80,  y: 100, icon: 'πŸ“¦', height: 100, color: '#3a3a2a' },
  { id: 'warehouse-2',    name: 'Storage Depot',     type: 'warehouse',    x: 310, y: 140, icon: 'πŸ“¦', height: 90,  color: '#3a3a2a' },
  { id: 'warehouse-3',    name: 'Cold Storage',      type: 'warehouse',    x: 540, y: 110, icon: '🧊', height: 105, color: '#2a3a4a' },
  { id: 'chop-shop',      name: 'Chop Shop',         type: 'criminal',     x: 160, y: 290, icon: 'πŸ”§', height: 85,  color: '#3a2a1a' },
  { id: 'hideout',        name: 'Abandoned Factory', type: 'villain-lair', x: 420, y: 270, icon: 'πŸ’€', height: 130, color: '#2a1a3a' },
  { id: 'rail-yard',      name: 'Rail Yard',         type: 'transport',    x: 620, y: 310, icon: 'πŸš‚', height: 75,  color: '#2a2a2a' },
  // ---- NEW ----
  { id: 'pawn-shop',      name: "Lucky's Pawn Shop", type: 'criminal',     x: 740, y: 30,  icon: 'πŸ’', height: 80,  color: '#2a2a1a' },
  { id: 'safe-house',     name: 'Hero Safe House',   type: 'safehouse',    x: 20,  y: 280, icon: 'πŸ›‘οΈ', height: 95,  color: '#1a3a2a' },
  { id: 'underground-hq', name: 'Underground HQ',    type: 'villain-lair', x: 740, y: 280, icon: '☠️', height: 110, color: '#1a0a2a' },
],
Note: safe-house uses type safehouse β€” a custom type. If you want a description, add it to LOCATION_DESCRIPTIONS first (see Adding a Custom Type above).

4. Save the file

In nano: Ctrl+O, Enter, Ctrl+X

5. Test it

Go to your browser, navigate to the game, and press Ctrl+Shift+R to hard-refresh. The new buildings will appear immediately.


After Editing

  • No server restart needed β€” buildings are client-side only
  • Hard refresh required β€” press Ctrl+Shift+R (or Cmd+Shift+R on Mac) to bypass the browser cache
  • All players must refresh β€” other players already in the game will see the old map until they refresh
  • If a building doesn't appear, check the browser console (F12) for JavaScript errors β€” usually a missing comma or duplicate id

Common Errors

Symptom Likely Cause
Building doesn't appear Missing comma after the previous entry, or a typo in the field names
All buildings disappear JavaScript syntax error β€” open browser console (F12) and look for the error line
Building appears in wrong place x/y values swapped, or forgetting that y increases downward
Location panel shows no description The type value doesn't match any key in LOCATION_DESCRIPTIONS
Two buildings overlap x values too close together β€” increase spacing by at least 150 px

Tips and Pitfalls

  • Always check the browser console after editing. A single missing comma will break the entire map. The console will tell you exactly which line.
  • Keep a backup. Before editing, run cp game.js game.js.bak so you can restore quickly.
  • Sketch your layout first. Draw the 900Γ—520 grid on paper or in a drawing app. Mark the roads at x:430 and y:220. Sketch where you want buildings before committing positions in code.
  • Tall buildings push down. A building with height:200 at y:270 will have its label at y:500 β€” nearly off the bottom of the map. Keep tall buildings in the top quadrants where there's more vertical space.
  • Villain lairs look best with dark purples. Colors like #1a0a2a or #2a0a3a give them a sinister look that stands out from the rest of the city.
  • The id field is used in CSS selectors. If a mission highlights a building (the glow effect), it looks up the element by data-building-id. If two buildings share an id, only the first one will glow.
  • Add buildings to match your missions. If you write a mission set at β€œThe Apex Arena”, add an arena building to the relevant zone first so players can click on it.

See also: Game Master & Artist Guide β€” Creating Missions β€” Art Replacement Guide

faserip/buildings.1770733729.txt.gz Β· Last modified: by freedomotter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki