Giter Club home page Giter Club logo

void's People

Contributors

djieste avatar greghib avatar jacobrhiel avatar jarryd229 avatar kiairatech avatar syntax2022 avatar tyluur avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

void's Issues

File-server message batching

Scu11
i process clients in batches
so i serve 20 assets to one client, then move onto the next
readding my client to the end of the queue if i have more to request
i found that batching the requests helped with transfer times
the "Js5Client"s are in a kotlin Channel
i take the first one from the channel
process 20 of their requests
add them back to the channel if they still have more to request
rinse and repeat

Player Saving

  • Switching between flat file and database
  • Storing client variable map

NPC pets/collectable items

Super rare collectable items dropped by npcs, perhaps even pets?

Items are used in the skilling guides and construction interfaces but could be used as collectables.

Could also be expanded out to collectable paintings/maps (8285..8293)

Ids Npcs
3241..3260 Ardy npc heads
4133..4149 Slayer npc bodies
4295, 4297 Ham member heads
4519..4521 Lumb cellar slayer npc bodies
4625 Bandit head
5068 Master farmer head
6063 Spirit tree
6105 Elf
6637 Dark beast
6661 Mogre
6695 Desert lizard
6709 Fever spider
6780 Menaphite thug
6781 Bandit
6782 Bandit
6811 Skeletal wyvern
7050 Harpie bug swarm
7420 Mutated zygomite
7499 Evil dave
7500 Dwarf
7501 Goblins
7502 Lumbridge sage
7503 Monkey
7504 Osman
7505 Pirate pete
7506 Sir amik varze
7507 Skrach
8131 Skeleton guard
8132 Guard dog
8133 Hobgoblin guard
8134 Baby red dragon
8135 Huge spider
8136 Troll guard
8137 Hellhound
8138 Demon
8139 Kalphite soldier
8140 Tok-xil
8141 Dagannoth
8142 Steel dragon
9952 Imp
9953 Kebbit
9954 Kebbit
9955 Kebbit
9956 Kebbit
9957 Kebbit
9958 Kebbit
9959 Kebbit
9960 Kebbit
9961 Kebbit
9962 Kebbit
9963 Kebbit
9964 Kebbit
9965 Crimson swift
9966 Copper longtail
9967 Cerulean twitch
9968 Golden warbler
9969 Tropical wagtail
9970 Butterfly
9971 Butterfly
9972 Butterfly
9973 Butterfly
9974 Giant eagle
9975 Rabbit
10591 Terror dog
10997 Molanisk
10998 Cave goblin
11047 Brine rat
11062 Zanik (slice)
14626 Phoenix eggling
14627 Phoenix eggling
14651 Abyssal minion
14652 Creeping hand
14653 Minitrice
14654 Baby basilisk
14655 Baby kurask
14656 Abyssal minion
14657 Creeping hand
14658 Minitrice
14659 Baby basilisk
14660 Baby kurask
14668 Captain undak
14669 Zanik
14670 Zanik
14741 Erjolf
14817 Leela
15498 Desert strykewyrm
15499 Jungle strykewyrm
15500 Ice strykewyrm
18791 Pit dog
18792 Pit ogre
18793 Pit rock protector
18794 Pit scabarite
18795 Pit black demon
18796 Pit iron dragon

Reloading data on the fly

Restructure yml config loaders and models to be able to be cleared and reloaded while the game is running. Throwing errors/sending the player a message if the format isn't valid

Map viewer

Bugs:

  • Zooming doesn't take mouse offset into account and always zooms to corner of tile causing a wobble
  • Diagonal underlay not aligning with walls
    image
    Compare with world map:
    image

Enhancements:

  • Multiple planes
  • UI
    • Navigating to coordinates
    • Region ids
    • Drawing lines/polygons/paths
    • Display x/y distance when drawing link
    • Settings
    • Area names
  • Add fade/transition animation for zooming
  • Zoom out further than 1:1
  • Use regular serialisers instead of manual ones

Interface modifications

  • Xp drop types
  • Add/remove all on trade/beast of burden/price checker interfaces
  • Collect all on collection box
  • Extra two slots of grand exchange
  • Settings button and second settings interface for toggles (e.g att always on top etc..)
  • Timer overlays (https://github.com/runelite/runelite/wiki/Timers)
  • Bank toggle placeholders
  • Money pouch
  • Price checker button to toggle alch/g.e prices

NPC Death & Respawn

Npcs should be hidden, moved and frozen to a random spot (in their spawn area) until respawn when they're made visible and unfrozen

Identify NPC traversal types

Check if there is a way of identifying which movement types NPC's are:

e.g Walk/Fly/Swim & whether they don't collide with other entities

Visual Updating Optimisation

Visual encoding can be entirely event-driven removing one entire entity iteration loop, just hand off to another context (which updating should execute in after?)
Change to single visuals class for players and npcs
Individual visual encoders rather than force npcs and players to share

Model lobby and game world as two separate worlds

Both the lobby and game servers are connected from the player's client. The lobby server is a world full of players, and so is the game world. The possibility of what is interactable is just different.

Player Statistics/Adventure log

Information the player might want to know or track. All should have timestamps (and maybe tile loc?)

Adventures log

  • Skill level up
  • Milestones
  • Quests completed
  • Songs unlocked
  • Treasure trails compelted
  • Bosses killed (with timers?)
  • Boss milestones (100, 200, 500, 1k kills)
  • Pets found
  • Rare drops
  • XP graphs

Eco

  • Total gp acquired
  • Total items sold g.e
  • Total items traded

Combat

  • Monsters slain
  • Total damage dealt
  • Total damage taken
  • Attacks missed
  • Deaths
  • Food consumed
  • HP gained from eating food

Skills

  • Time spent on each skill

  • Trees cut

  • Fish caught

  • Logs burnt

  • Food cooked

  • Food burnt

  • Ores mined

  • Bars smelted

  • Items smithed

  • Successful pickpockets

  • Failed pickpockets

  • Allotments harvested

  • Compost used

  • Crops died

  • Items fletched

  • Items crafted

  • Runes crafted

  • Potions brewed

  • Potions used

Split file-server

File-server shouldn't be apart of the game server as it will effect players if they can't get required files because the game-server is updating.

Consequences if the game server is updating

  • Players can't load to the login-screen (and so #28 can't be fullfilled)
  • If the player is at the login-screen but doesn't have the full cache loaded, file requests will fail and even if the server is back up those files e.g sprites won't be optained until the client restarts

Request Assistance

  • Request
  • Interface
  • Experience
  • Distance cancelling
  • Modified level requirements
  • Privacy Settings - Waiting on friends list Player.hasFriend(other)
  • Request timeout
  • 24 hour time up message

Skill Bonuses/Rewards

Ideas

  • % double rewards

  • % increased speed

  • % increased success rate

  • % item not consumed (preserve?)

  • Doing the same thing repeatedly improves efficiency (e.g fletching the same item over and over)

  • Skillcape for 99, (t) for 200m xp

Combat bonuses system

A system to store/calculate effective attack, strength, defence bonuses used in the combat calculations.
Need to be modifiable by multipliers (prayers, void, effects etc..) and amounts (for attack style)

Add persistent container support

Should all containers be saved?

Depends on answers for personalised shops #137

If not then will need to be able to distinguish saved containers from unsaved ones.

Calculate container stack modes

See if there's a way of identifying what stack type a container is using cache data.
If not implement a system which stores additional container details.

Tag system

Being able to tag entities with useful identifiers for easy filtering

E.g "Guilded Altar" object has "prayer altar" tag

Things that can be tagged:

  • Players
  • NPCs
  • Objects
  • Areas
  • Tiles?

entity.tag("name")
entity.tagged("name")

questions

  • How is a tag any different from a CharacterValue boolean?
  • are tags static or can any entity have individual private tags on other entities too? (same as #177)
  • Can this be stored in definitions in the cache and serialized?
class TagSystem {
    val staticTags: Map<Entity, Set<String>>
    val dynamicTags: Map<Entity, Map<Entity, Set<String>>>

    fun Entity.tag(target: Entity, tag: String) {
        dynamicTags[target][this] = tag
    }

    fun Entity.tagged(target: Entity, tag: String) {
        val tags = dynamicTags[target][this]
        If(tags.contains(tag))
        Return true
        Tags = staticTags[target]
        If tags contains tag
                Return true
        Return false
    }

    fun clearTags(entity: Entity) {
        dynamicTags.remove(entity)
    }
}

Content Longevity

Players typically expect the ability to wield all items shortly after joining, with high xp rates or cheap items. Giving a balance of 90% of content accessible straight away and 10% needing to be obtained through boss drop. There's a number of issues with that:

Longevity

Players need the "what's next" to keep playing.

  • Level to get
  • Item to obtain
  • Boss to kill
  • Time to beat
  • Goal
  • Achivement
  • Outfit
    etc...
    By giving 90% of content up-front (or within first few hours/days/weeks), players run out of things to do (end-game) and move on to another server (churn). This also puts pressure on devs to put out content quickly and unsustainably as end-game players will often complete content faster than it takes a dev to build. Also there's limited room for sense of improvement, No player is going to be in iron oogling over a guy in addy. It's paid for, max gear, or nothing.

Solutions

Changing exp rates

Low exp rates - Server lasts longer, lots of players don't like
Multiple game-modes/prestiging - overdone, bad attempt at re-playability, would need more variation between modes/prestiges to keep the game fresh. Lots of pre-conseived opinions about "x10, x25, x100".
Custom xp curve - Haven't seen done a lot, would give a new feel to the game, could make it much flatter of a curve, maybe make lvl 75/80 half way between 0-99 instead of 92.

New equipment requirements

Linking achievements with equipment requirements would limit how quickly players progress, gives players a new challenge to obtain amours (instead of typical, rock crabs for 10 mins), changing up what items other players are seen using (max cape player using mith to get achievements for comp cape), and giving a better sense of achievement to players for wearing armour.

Whatever the solution there is going to be a sub-group of players which won't like it and call it stupid that they don't get everything they want easily. I think we should categorise these players as "spoiled babies" and the response to them should always be; tough it's better for everyone.

Add clear and consistent player creation and destruction events

The current events for a player are just a crazy mess that needs tidying up. They exist because of necessary login/out timing so watch out when refactoring.

Login
RegionLogin
PlayerRegistered
Player#start()
Registered
PlayerSpawn

Logout
Unregistered
PlayerDespawn

Introduction Quest

The tutorial should be engaging and meaningful. A player must be given decisions and feel as if they have concequences.

Example the knight in shining armour trope:
Someone's in trouble, their health decreasing (dungeoneering head menu's/health bar would be great for this), the player must help them otherwise they die (after 2 minutes, show the death animation and replace the npc with a skeleton obj & ghost npc). As a concequence they must go get a ghost speak amulet to continue.

Might be good to have a non-combat way of completing the quest to include skillers (ofc no xp given anyway, but some people don't like combat)

How to handle tutorials without being boring
The not so simple secrets to making good tutorials

Instruction based configuration

A lot of content actually comprises of basic repeatable operations/instructions which could be stored as configuration.

RSPS typically at best manage with a tonne of enumerated "handlers", and at worse one gigantic class of functions. However this data is static during gameplay so there is the option for it to be stored as configuration.

Examples for usage include:

  • Combat
    • Spells
    • Special attacks
    • NPC attack strategies
  • Summoning familiar spells
  • Potion effects?

Pros:

  • Ability to hotfix and reload data without needing to recompile code
  • Creating configuration doesn't require programming knowledge (editors).
  • Keeps code clean

Cons:

  • The instruction set (and use cases) does need to be known and scoped out upfront
  • Scoping could go too far (starts to become runescript)

See Bytecode for implementation ideas. Very similar to the opcode style of cache definitions.

Hiscores

As much content as possible should have in-game hiscores.

Whether that's number of npc kills, most high value loots, fastest kills, highest score in a minigame.

Ties in with adventures log.

Keeping hiscores in-game will be much easier than having them all online too. It's better the game is the social hub, not the website.

Experience rate and Game-modes

As mentioned in dusk-rs/dusk#88 (comment) players are familiar with multiple game-modes where they can choose an exp-multiplier.

The average player will stick to a reasonably high Exp rate (100x+) when given the choice. However, it's known that typically the lower the exp rate, the longer the server will last.

The consequences of game-modes are:

  • Splitting community
  • Incomparable achievements
  • Extra work to accompany multiple sets of hiscores.
  • Player's picking higher exp rates
  • Player's have preconceived ideas about what xp rates are too much or too little (irrespective of which they'd actually enjoy the most)
  • Players with high exp rates will quickly skip over low-level content

Given the opportunity, players will optimize the fun out of a game.

  1. Player's shouldn't get to choose experience rates.
  2. Community splitting should be kept to a minimum

Proposal

Exp rates

RS has a near-exponential curve where level 92 experience wise is halfway between 0-99.

  • Flatten out the curve so ~60-75 is halfway to 99.
  • Provide only one really low experience rate (x10/x15)
  • Make skilling easier as described in #139
  • Provide lots of experience lamps and bonus experience timer rewards from #150 and #152

It's important it's advertised and explained as a "custom levelling curve". "Lower rates + easier skills = less grinding"

Game modes

Maybe ironman game-modes, maybe iron-man minigames?

Player Retention

First Time User Experience

First Time User Experience (FTUE) should have as few blockers as possible to get in-game.

  • Direct Login/Quick Play button for logging in while skipping the lobby
    • This could be taken a step further with a "first time player" button which logs into a temp account to do the intro quest, after which the players name + password is asked.
  • Tutorial quest should be engaging and meaningful - (someone's in trouble, their health decreasing, the player must help them otherwise they die)
  • Quick login. Account save spaces, either via login screen or runelite esq plugin.

Best practices for a successful FTUE

Retaining existing players

Ideas

  • Reward players for resting (xp boost after 1h break, up to a max of 24h/2x)
  • Daily rewards/tasks (aka delayed feedback loops)

10 ways to retain your players

#53

Enhancing Runescape

Runescape (osrs and rs2 more than rs3) uses very rigid design and rsps almost entirely emulates this rigidness. There's the opportunity to go above and beyond how Runescape works and improve upon certain areas. This no doubt is very different from how things are traditionally done, and what players expect from a private server. However players also find the scene stale, you can't have it both ways. We'll have to decide on what balance to strike between the two.

Examples

Dynamic Spawns

Rigid: Spawn cows in these exact coordinates every X ticks after death
Enhanced: Here's a cow field, spawn 18 cows in it but not near a player.

NPC AI

Non-combat

Rigid: Walk randomly every X ticks
Enhanced: An NPC will choose between behaviours which make sense for it. E.g a regular Man/Woman might go into a house, use the stove, go to a store, walk to the pub, go to a bank etc..

Combat

Rigid: If I'm X tiles away from my spawn point I won't walk any further and you can safe spot me from that distance
Enhanced: I'll stray slightly further than I should if the player isn't that much further away

Day-night cycle

Rigid: All shops are open always, it's non-stop daytime
Enhanced: Shops close at night, combat NPC's turn aggressive or respawn faster

Bots

Rigid: RS: Unfair, breaks rules, ruins economy RSPS: Actual players online; 200, Player count: 405!
Enhanced: It's a feature not a bug! Bots go around doing tasks like players; skills, minigames, pking. They make the game feel more active and alive, can be made to contribute to the economy by selling things to players, can be killed for loot, can assist players with skills and bosses, and they populate minigames when not enough real players are around to play.

Custom experience rates

Touched on this in #154

AOF looting

#136

Interface enhancements

#214

Customisable respawn points

Dynamic npc combat

When a npc defeats you in battle they get stronger and drop better loot, when they loose multiple times over the loot get's worse.

NPCs players can't walk through

Gorillas in ape atoll
Skeleton minions in dungeoneering
Barricades? - might be an object
Brawlers in pest control

  • Is there a flag for this in npc definitions?
  • How to do it? Just make the npc steps using object collision flags?

Tile distance utilities

tile.withinRange(otherTile, distance)
tile.distance(otherTile)
Used often, also doesn't really belong in Tile, better in 2d coordinates?

Unknown player updating bug

Index out of bounds exception -86
Class372.method4103 line 41
Traces back to Class91 line 262.

Related to movement & temporary movement type. Occured when entering a removed dynamic region.

Happened 3 times in a row and then wasn't able to replicate a 4th time to get any more info.
Could've been caused by incorrect data sent to another flag.

Can't face objects that are on the same tile

i.e interacting while standing on the same tile as Ivy or a Shelf won't turn to face the object because Player.face(tile) uses delta which in that scenario is 0, 0. Will need an "override" method to calculate the direction for objects based on the object type and rotation.

Collision types

Sky/Ignored types aren't correct/working as expected, needs fixing.

Player Appearance Updating Optimisation

Visuals#addition currently always includes appearance, however if a player is re-added the apperance update isn't necessary.

Would first have to track what players have/haven't been seen before. Which could be worked out using lastSeen?

Preventing economy inflation

Both of currency and items.

We should keep track of both amounts coming into (swells) and exiting the game (sinks) so we have the data to make informed decisions to better balance the game to prevent excessive inflation.

Gold

RSPS player expect a higher gold rate than rs, whatever we go with whether x10, x100 or x1000 it'll be intentionally inflated, but that doesn't mean we should let inflation beyond that point go out of control.

Swells

  • Alchemy
  • PvM drops
  • Untradable PvP drops
  • General store
  • Thieving - Not in the original game but in most rsps

Sinks

  • Degraded item repair
  • Players quitting
  • Shops
  • G.E trade fee

Items

When a place reaches the level requirement it makes all prior items useless leaving all items except the few high level ones valueless. RS3 combated this with invention, removing junk items from the game saughtafter by players training the skill thus increasing their value (subsequently making low level players making better money).

There could also be some kind of minigame (thinking gun wars in COD) where the entry fee is one of each type of item in a category (e.g scimitars bronze-dragon) losers don't keep them and winner keeps theirs and the top one (dragon) from of all their defeated opponents.

Swells

  • PvM (bosses, slayer)
  • Shops

Sinks

  • Alchemy
  • Dropping/destroy/death
  • Players quitting

Real world store purchases

Depends what is sold, selling direct gp isn't a good idea, most likely items, better to sell cosmetics and boosts (yell, xp, rewards)
See #151

Decide what content we want to add from osrs

Some OSRS content is highly influenced by pre-eoc content and we need to decide on what type of server we will be. Are we going to be OSRS offered in RS2011 visuals? Or are we going to be a blend of both OSRS and RS2011, by picking and choosing what content we want?

For example, ragefire boots are equivalent to eternal boots. Should we replace the content in 667 with the content of OSRS? In this example, this would mean removing Glacors and adding Cerberus.

Core Gameplay Loop

Problem

RuneScape follows the do skill - get loot - level up core gameplay loop.
The problem with this is rsps players get fed up of repeating the same skills on different servers, and so it becomes grinding micro actions to get macro rewards. However once max level is reached, end-game content alone isn't enough to keep a player entertained and so end-game players become dependent on content-releases for entertainment.

Runescape solution

RuneScape solves this in two ways:

  • Breaking up repetivie skills with other content:
    • Strange rocks, birds nests
    • Distractions & diversions
    • Minigames
    • Random events
  • Allowing players to start over with different challenges aka Gamemodes

Even with identical content to RS players would soon get bored.

Solution

Adding tweaks to existing skill mechanics to keep them fresh and interesting, while still familiar.

RSPS's tend to do these changes within the context of fixed game-modes. There's no reason a player couldn't pick-and-choose to create custom gamemodes.

Basic examples of changes:

  • Skill
    • Introduce dungeoneering content into main world
  • Loot
    • Skills give coins
    • Smart loot (Give drops related to characters class)
    • Duplicate free loot (cycles between high level rewards)
  • Level up
    • Outside of pvp, combat xp is only given upon killing the monster

Any changes should be clearly communicated to the player so they are not surprised.

Importance of a well defined core gameplay loop
Difference between random and randomized progression
How to break down game design

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.