Giter Site home page Giter Site logo

orderoftheporcupine / projectporcupine Goto Github PK

View Code? Open in Web Editor NEW
294.0 294.0 91.0 41.51 MB

Project Porcupine: A Base-Building Game...in Space!

License: GNU General Public License v3.0

C# 96.98% Lua 2.22% Python 0.09% Shell 0.46% ShaderLab 0.24%

projectporcupine's People

Contributors

abackwood avatar alexanderfast avatar bjubes avatar braedonwooding avatar dan54 avatar dormanil avatar dusho avatar filippoleon avatar geoffrotism avatar grenkin1988 avatar hooch0 avatar jaselito avatar kd7uiy avatar koosemose avatar mikejbrown avatar nogginbops avatar noobpete avatar quill18 avatar quizr avatar raketfart avatar relinu avatar rodritter avatar sboigelot avatar sommerbo avatar theriven avatar tommalbran avatar tranberry avatar tritaris avatar vogonistic avatar zwrawr 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 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  avatar  avatar  avatar  avatar  avatar

projectporcupine's Issues

[Discussion] JSON Formatting for files

Issue by BraedonWooding
Thursday Apr 06, 2017 at 05:59 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1794


Information

This is purely design, and doesn't contain the full document. Some of the names are capitalized (maybe incorrectly but again this is more the layout then specifics).

Structure?

The structure follows a more modern and cleaner json style, instead of an array of objects we just define it as a single object with the top level property names often being the 'type' or 'name' of the object, i.e.
{ "power_cable": {...} }. This means that iterating through every property which while is a little more work on our side, makes the modders job easier and makes documents actually readable. Every document is valid JSON also (obviously).

Examples

This

<?xml version="1.0" encoding="utf-8" ?>
<Inventories>
    <Inventory type="raw_iron" maxStackSize="50" basePrice="0.8" category="inv_cat_raw" localizationName="inv_raw_iron" localizationDesc="inv_raw_iron_desc"/>
    <Inventory type="ice" maxStackSize="10" basePrice="1.2" category="inv_cat_raw" localizationName="inv_ice" localizationDesc="inv_ice_desc"/>
    <Inventory type="raw_copper" maxStackSize="50" basePrice="0.8" category="inv_cat_raw" localizationName="inv_raw_copper" localizationDesc="inv_raw_copper_desc"/>
</Inventories>

To

{
	"raw_iron": {
		"MaxStackSize": 50,
		"BasePrice": 0.8,
		"Category": "inv_cat_raw",
		"LocalizationName": "inv_raw_iron",
		"LocalizationDesc": "inv_raw_iron_desc"
	},
	"ice": {
		"MaxStackSize": 10,
		"BasePrice": 1.2,
		"Category": "inv_cat_raw",
		"LocalizationName": "inv_ice",
		"LocalizationDesc": "inv_ice_desc"
	},
	"raw_copper": {
		"MaxStackSize": 50,
		"BasePrice": 0.8,
		"Category": "inv_cat_raw",
		"LocalizationName": "inv_raw_copper",
		"LocalizationDesc": "inv_raw_copper_desc"
	}
}

This

<?xml version="1.0" encoding="utf-8"?>
<Overlays>
    <Overlay type="oxygen" min="0" max="1" colorMap="Jet">oxygenValueAt</Overlay>
    <Overlay type="room" min="0" max="1" colorMap="Random">roomNumberValueAt</Overlay>
</Overlays>

To

{
	"oxygen": {
		"min": 0,
		"max": 1,
		"colorMap": "Jet",
		"functionName": "oxygenValueAt"
	},
	"room": {
		"min": 0,
		"max": 1,
		"colorMap": "Random",
		"functionName": "roomNumberAtValueAt"
	}
}

Files

Below are all the files. They are in .txt cause that is the only format that github allows for text.
Headlines.txt
Inventory.txt
Need.txt
Overlay.txt
PerformanceHUDTemplate.txt
Quest.txt
RoomBehavior.txt
SettingsTemplate.txt
SheduledEvents.txt
Ships.txt
Stats.txt
Tiles.txt
Trader.txt
Utility.txt
ConsoleCommands.txt
Currency.txt
Furniture.txt
GameEvents.txt

[Discussion] [Feedback] Key bindings and mod possibilities

Issue by frankitox16
Tuesday Oct 18, 2016 at 22:31 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1554


Right now key bindings are not exactly flexible enough. Keys are hardcoded in the KeyboardManager class (which has a ReadXmlOrJsonAfterWeDecide() -- Seems we need to decide this). I was thinking that instead of using Xml or Json have a separated list of strings like:

# This is a comment.
# "actionName",KeyModifier,KeyCodes[]
# "actionName",KeyModifier,KeyCodes[]
#
# KeyModifiers:
# None = 0
# Control = 1
# Shift = 2
# Alt = 4

"MoveCameraEast",0,68,39
"MoveCameraWest",0,65,37
...

Why this way and not Json or XML?

Because of two reasons:

  1. It's a more compact, clean way to show the end user their prefs.
  2. It will allow modders to add their own key binding to custom actions.

Custom actions?

This would be a baby step towards mods being able to handle key input. As an example, let's say that I add to the last list this:

...
# Mod key bindings
"OpenMyMenu",1,76
...

And in a specific lua file (maybe a common one for keyboard inputs) there's a function called OpenMyMenu() that opens up a specific menu when the key's pressed.

Anyway, this is just my opinion on how this could be handled. I'd like to know what you people think and how you'd tackle this issue.

Sounds that don't have Hooks yet

Issue by Jaytheway
Wednesday Dec 21, 2016 at 11:26 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1706


Deconstruct_Furniture - there are 3 variants
cloning_pod_anim - shoud play before new clone pops out
Default_Furniture - should play instead of current Error sound when there is no corresponding sound file for the furniture being placed
Error - this should play when you try to place furniture on invalid tile (e.g. no floor, on top of something else)

Ambiance - should not have 3D positional properties, it should start playing when the game starts.
This sound is just for the implementation testing:
-2D sound
-looping
-pausing when the game close
-resuming when a save game loaded (purely testing)
It is not intended to be in game "for real", although it may.

These were not included in my latest PR:
Door_Open: https://www.dropbox.com/s/gzx6lmylx4ciy6v/Door_Open.ogg?dl=0
Door_Close: https://www.dropbox.com/s/9cve8ab41btj6jv/Door_Close.ogg?dl=0

Pings: @koosemose

Effects (fire, fog, etc..)

Issue by bjubes
Monday Oct 03, 2016 at 20:04 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1487


Currently there is no system to add what i'm temporarily calling "effects" into the game, such as fire #1462 which is like a furniture in the sense that it occupies a tile, but also coexists within the same tile as an existing furniture. As a result fire is hard to implement, because it is not a furniture despite having many similar qualities.

I propose that we add a separate class for objects of this nature which either inherits from furniture or is very similar, but has a separate property in tile where it exists so a piece of furniture and a fire can exist in the same tile.

Here is a quote on the issue from @TomMalbran

I think that it makes no sense to add [fire] as a furniture. We can make a PR that is not as big that just adds a new type of "Buildable" called Effect or something like that, and the Fire implementation. The Effect class can start as a copy of Furniture or Utility were we remove everything that is not needed for effects, a manager that can be a copy of the UtilityManager, and a reference in tiles.

We can later add another PR that can deal better with fire and other effects, if that is required.

At some point we can grab the buildables, and maybe their managers and think about using subclassing.

Please give feedback on what you think is the best implementation for "effects", good names for "effects" or anything else before this is implemented

Implementation of Gear

Currently @SidneyArmitage is working on this.

Issue by longtomjr
Saturday Jan 21, 2017 at 19:54 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1763


This is open for discussion and will be edited. See original discussion #268

Functionality:

  • Need to be separate from the Character's inventory
  • Separate Class
    • Most traits defined in XML(/JSON) and LUA (LUA for funtionality)
  • Spacesuit: How do we do this?

What needs discussion:

  • Handling Spacesuits.
  • An object for Gear (the actual item) and an object for the gear slot, or have that built into the character object?
  • How to handle non equipped items?
  • How to implement "slots" for gear?
  • Multiple functionality for gear? (one item doing more than one thing)

New Job System(tm)

Issue by vogonistic
Wednesday Aug 24, 2016 at 07:34 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#726


Coming soon to a Porcupine-style game near you!

This is an attempt at describing the new Job System(tm) that we (@svmnotn @gunthergun) are working on.

Here is how it operates more or less: You create a Goal based on one or more Needs:

new Goal("Build a Wall", World.current.GetTileAt(0, 0), new Needs()
    {
        { steelPlateResource, 5 },
        { iceResource, 50 }
    });

Goal will be created from a Job, or maybe replaced by a Job.

Resolve will create a Path from the Goal and for each Path we have, loop over a list of functions that looks for matches of the Needs. If they find a match, they output an Action that has Needs it provides and requires. We take the action and create a new Path that also includes that action. We keep going until we've exhausted the search or we found the goal. There is only some basic actions implemented now, like forging and fetching. Here is the result of running it to fetch 20 ice:

foundPath =>  [PathToGoal cost: 97
  [Goal name: Build a Wall, tile: [Floor, X=51, Y=51], requires: ([Needs
  Ice: 20,
])]
  Fulfilled: [Needs
    Ice: 20,
  ]
  Actions:
    [Action name: Fetch Ice, cost: 24, tile: [Floor, X=31, Y=27]]
    [Action name: Fetch Ice, cost: 6, tile: [Floor, X=26, Y=29]]
    [Action name: Fetch Ice, cost: 43, tile: [Floor, X=13, Y=71]]
    [Action name: Fetch Ice, cost: 24, tile: [Floor, X=36, Y=79]]
[Overrides
  [Floor, X=31, Y=27]: 0,
  [Floor, X=26, Y=29]: 0,
  [Floor, X=13, Y=71]: 0,
  [Floor, X=36, Y=79]: 1,
]
]

Things I'm thinking about:

  1. I'm currently tracking cost in time. Need to ask the Character if they want to apply a modifier to paths and actions (Afraid of open spaces? Hate a particular machine?)
  2. Do we optimize the walking to the closest resource (create a walk action) or do we just check that it exists and let the character deal with it (recreate the pathfinding and verify that the resource still exists) as they pop the action? Can the pathfinder give us a rough estimate?
  3. How do you detect loops? Do we just let them happen and have a cutoff in how long the paths can be?
  4. What can't we implement with a system like this?
  5. If people are idling and have an organization skill, they could look at all the actions in the queue and determine that there is a need for 100 steel plates in room 42. If there is a stockpile, they could create a job to transfer the plates there.
  6. How do we create a job to do basic housekeeping items? Removing dust, feeding the generator, stocking items, carrying stuff to stockpiles?
  7. How does this work with something like defending against attackers?
  8. How do we integrate some kind of smartness so that a guy a mile away doesn't grab a critical job, like building a tile in a bridge.

Next actions:

  • Replace Condition with Needs<string, int>
  • Split into 1 class per file
  • Create XML tag allowing for multiple inputs and outputs, plus provide the machine max and output ratio (use inventory prefab max stack size as default max)
  • Need to take walking into account. I.e. if you need ice and steel, go fetch one, drop it off, fetch second, drop it off. Different path from being able to carry both.
  • Add code that can figure out if we need to drop off inventory or can pick up more
  • Let the Character modify cost for path and action
  • Integrate into InventoryManager
  • Add support for changes to InventoryManager that hasn't happened yet
  • Move jobs to rooms
  • Create job manager
  • Be able to batch and sort jobs intelligently

It's early code so take it for what it is: https://github.com/vogonistic/ProjectPorcupine/blob/job-optimizer/Assets/Scripts/Jobs/

@svmnotn Ping!

[Feature Todo list] Trading System

Issue by sboigelot
Thursday Sep 01, 2016 at 11:05 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1075


Here is a list of task for the current simple trading system (rimworld like)

I'm adding it here as a reference to keep track of the progress in the feature. If you wish to handle one of the sub-tasks, don't hesitate to start on it, just post a comment here so we don't make concurrent work

  • Add landing pad furniture
  • make landing pad only buildable outside
  • Create a trader prototypes
  • The traders are random variation on trader prototypes
  • Add Currencies
  • Create a trade UI
  • Have trade ship landing on the landing pad and able to leave the map
  • Sell Items from stockpiles
  • Bougth items spawn near landing pad
  • Trade ship visit at random times (using Scheduler system [PR #1097])
  • Register TradeShip on the World (and have a trade Controller if needed) [PR #1097]
  • Remove Context Menu Item on Landing pad to "Call a trade ship" this is just a test action [PR #1097]
  • Disallow trade to be concluded if player/trader do not have enough money or stock [PR #1097]
  • Have a base price on item prototypes [PR #1109]
  • Have a category on item prototypes [PR #1109]
  • Allow trader prototype to have a stock prototype based on item category (keep the version based on item object type as well) [PR #1191]
  • Make currencies visible somewhere on the UI [PR #1143]
  • Trade ship visit frequency increase according to [base value]/[time played]/[renown]
  • Make "trade with trader" a queuable job by selecting a character and context menu on a trade ship on a landing pad (remove auto opening of trading UI when trade ship land) (Waiting for new job system)
  • Save / Load TradeShip currently visiting
  • When the trade is complete, do not teleport item from stockpile to the trader ship, create hauling job for them. Only finish the trade when all item have been transported (PlanetBase style)
  • Add a funiture (console, beacon, etc) that can increase the likelyhood of a trader visiting the base (call specific trader, call anyone, etc) at the cost of the time of a character
  • Add a Banished-like feature that allow the player to request a specific item to a trader for him to bring on his next visit. The requested item will have a higher price

Later

  • Use #1063 for trade ship visits

[Overhaul] Future of Project Porcupine

Issue by BraedonWooding
Thursday Mar 30, 2017 at 05:52 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1789


Project Porcupine needs a system wise facelift to be relevant. Feature wise we need more to separate us from other games and I think the key is in factions and allowing you to fly spaceships around and manage trade between a few large bases. But to tackle any facelift we need to isolate the problems of the project and move to change them. So below is a mostly comprehensive (tell me if I missed anything) of ANY thing that needs work, I have given a personal judgement on what should happen, once we decide then we can work on fixing the small things, then having a more focused game to allow developers to jump in and easily make changes and have fun! I'll do some of the bigger points first then just a list.

How do we do this?

Everything on this list needs work (+ others I'm sure). But documentation is key, so it's about documenting how they currently work and suggested changes then as a community we can discuss changes then make changes; proper gamedev style.

UI

  • In most cases it's counter-intuitive and lacking. Mod dialogs are somewhat annoying to build and extend and it doesn't make a whole lot of sense and is quite static.
  • Suggestion: Begin removing the old UI systems and replace them with my UI system, it will have support for LUA very soon, using a custom LUA table to interact between them, obviously it won't be as powerful in LUA but for most cases around 90% of it can be done in the XML/JSON and even more with custom parameter support which was added recently! This means we can make it very similar to the android way but also allow more closer access ( @koosemose suggested more of an android approach ).
  • Pros: Very easy to use, allow extending the base UI element for a different array of uses, i.e. the PerformanceHUD allows you to use an update function where the settings menu uses apply and cancel functions. Custom parameters for easy API use of good base classes.
  • Cons: Not as easy to just insert into a system, requires an extensive use of layouts (which will make sure everything works pretty) but will often result in more time setting it up. Can't just 'create' a place on the screen has to assign it to somewhere, this means that a dialog will most likely just be a static window (and position) with its contents being dynamic with this system.

Job System

  • There is a lot, and I've discussed it before so #726 #1590 cover it better. Basically needs an overhaul, I'm thinking going utility route, i.e. ISearchable, IFindable, IStorage and so on.
  • Suggestion: From completely scratch, get it right second time kind of thing. MASSIVE undertaking however.

Components

  • While I have my concerns about it, I kind of also see its power and potential. Maybe a facelift from API and ease of use / documentation would reallllyyyyy help.

List of others

  • Traders, mostly incomplete
    • Suggestion: Deprecate for now, then later re-add with more focus on factions
  • Quests, broken? Lacking
    • Suggestion: Deprecate for now, then later re-add with more focus on impact on fuactions.
  • Temperature and Atmosphere, in a WIP PR
    • Suggestion: Don't add any new features that use this system and keep it deprecated till author has more time, or move it to someone else.
  • Pathfinding, issues here and there
    • Suggestion: Mostly good keep it in its current format, just isolated so it can be redone at one point.
  • Localization, actually quite good. Some old code
    • Suggestion: Actually quite like it, sometimes a bit awkward and probably needs threading and there was a PR previously that fixed a lot of issues so maybe look into that and finish it?
  • Utilities, getting there and quite powerful
    • Suggestion: No problems that I can see of, and quite popular for changes so maybe small changes but quite good.
  • Modding, weak and everywhere
    • Suggestion: A lot of code is everywhere for the modding, some of it supports it, some of it only supports one language (I'm at fault for this), and some supports really well. UI Dialogs are messy, and a lot of the code feels that way. Temperature and other key components should be moved to a mod, note they can still be native but they have to be toggleable (in case we need speed).
  • World, mostly 'future'
    • Suggestion: I personally love the 3D space we give and the ability to fight in 3D space using a 2D ship could be really cool and fun, along with allowing a great deal of help. Though I think taking an even more isometric point of view is necessary. I'm talking almost 45 degrees rather than our current ~15. Then rotating around, so basically it's like imagine a 3D view... but 2D? I mean we could even go 3D to be perfectly honest but frame rates and stuff would suffer.
  • World Gen is basically perfect right now, I quite like it
  • Characters need more stats and focus!
    • Suggestion: Ignore for now, but maybe even implement support but not direct interaction. Basically just keep everything functional and isolated so moving to a new format or adding stuff is easy.
  • Building, not context sensitive!
    • Suggestion: If I'm building a wall I want a line not an area. So have options? Seems good else wise.
  • Furniture, Not really a problem
    • Suggestion: Probably needs some changes at one point but currently good.
  • Events, not powerful enough
    • Suggestion: Too weak and safe, needs more power
  • Wallet, currency all that stuff is too weak and isn't used and probably needs changes
    • Suggestion: Really just feels 'there' needs a reason or deprecate till traders are back

If there are any more comment below!

Note: I'm not including the SettingsMenu, DevConsole and PerformanceHUD on this since they are all new features (along with asteroid generator, game time, sound...) and will receive small changes but seem to be done right. They are isolated so updating is easy!

Planning for Async/Non-Blocking World Loading

Issue by bjubes
Sunday Feb 26, 2017 at 17:30 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1784


As discussed in #1593, one of the largest lag spikes in the game is loading a new world or save. Since this is not done asyncronously, the build appears to have crashed and prompts the user to force close the program. Fixing this is a complex task, So i'm putting together a place to create a solution.

The Problem

When the new world is loaded, a variety of slow operation all fire at once.

  • loading the save file/ generating a new world
  • Destroying everything in the current scene, and the resulting garbage collection
  • Instantiating every game object in the new scene, and the resulting memory allocation and unity lag that comes with Instanciating.
  • running the start method of every object in the _World, which then calls almost every constructor of every manager, controller, etc...
  • If its a save, the characters may all have a pathfinding call on top of that.

The Solution

I plan to focus on the fourth bullet, the constructors/start methods of every single manager and controller called when the game loads. These can be split into two categories: Unity centric and non Unity centric. The former interact with some aspect of unity that cannot be put in another thread, like Resource.Load or instanciating gameobjects. the latter only do calculations or can be tailored to do most of their work asyncronously and do the unity specific-work in a callback.

First every start method and constructor has to be analyzed to see what category it falls into. Next, a "master" object will be repsponsible for invoking all start/initialization related calls. Those that have no unity interaction can be run in another thread, while the unity centric ones are put into a queue inside the master object. The master object starts a couroutine where it cycles through the queue like so

//pseudo-code - inside a coroutine
start a timer
while ( timer < maxTimeAllowedPerFrame) {
nextItemInQueue();
}
yield return null;

so that the longest hang time is reduced to the time it takes one function to run/the maxTimeAllowed. Obviously this could take a very long time to complete, so it is important to thread as many calculations and split up large calls into smaller parts. While the queue is still full, the user simply gets a "loading..." dialog and the game will never lag long enough for the OS to report it as not working.

last note: any processes that need to happen in a specific order can hopefully be achieved by a series of callbacks, so that when the first one finishes it puts the next callback into the master queue.

This video is an implementation of a similar system. Its used for pathfinding but the general idea is the same.

Discussion on how to handle gear such as a spacesuit

Issue by koosemose
Friday Aug 19, 2016 at 13:29 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#268


While I'm not quite sure if it's time to try to implement gear, I do think it would be useful to have discussion on how to handle it, as many other features will likely affect/be affected by gear and how it's handled.

It seems fairly clear it should be something distinct from a character's inventory, both because that would only allow a character to carry or wear one thing (and not both carry and wear, so no carrying things in space), and because that seemed to be quills intent (based on the comment on the Character.cs inventory field).

I would assume Gear would be a separate class, and following the example of furniture, most traits would be defined in xml and lua, such as if it has a "use" option and what it does. It would also need something to hint to the AI what it's used for (is it a weapon, is it a space suit, is it a Fine suit to be worn on a date?)

Of particular concern is the spacesuit, as it's more of a preventative thing. If possible it's best to avoid something in the class itself to tell whatever handles being affected by vacuum that it prevents that, but you can't exactly code in LUA for something to NOT happen, and you certainly can't expect every other piece of clothing to code in being damaged if you're in vacuum (especially since that would imply you wouldn't get hurt while naked). Similarly if being in space without a spacesuit affects your movement in any way.

Discussion on how to handle gear such as a spacesuit

Issue by koosemose
Friday Aug 19, 2016 at 13:29 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#268


While I'm not quite sure if it's time to try to implement gear, I do think it would be useful to have discussion on how to handle it, as many other features will likely affect/be affected by gear and how it's handled.

It seems fairly clear it should be something distinct from a character's inventory, both because that would only allow a character to carry or wear one thing (and not both carry and wear, so no carrying things in space), and because that seemed to be quills intent (based on the comment on the Character.cs inventory field).

I would assume Gear would be a separate class, and following the example of furniture, most traits would be defined in xml and lua, such as if it has a "use" option and what it does. It would also need something to hint to the AI what it's used for (is it a weapon, is it a space suit, is it a Fine suit to be worn on a date?)

Of particular concern is the spacesuit, as it's more of a preventative thing. If possible it's best to avoid something in the class itself to tell whatever handles being affected by vacuum that it prevents that, but you can't exactly code in LUA for something to NOT happen, and you certainly can't expect every other piece of clothing to code in being damaged if you're in vacuum (especially since that would imply you wouldn't get hurt while naked). Similarly if being in space without a spacesuit affects your movement in any way.

Dynamically generated localization keys

Issue by koosemose
Thursday Nov 03, 2016 at 11:49 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1609


Currently localization keys are explicitly set in the xml, however in nearly all cases the localization key for the name is some form of the item's type, and the localization key for description is that plus _desc.

With the changes to item types in #1607 (rename all items to use the same scheme) this makes the localization keys item_class+item_type, and for description +_desc. We could easily have GetName() return the class shorthand + the item type, and have GetDescription return that plus _desc.

Pros:
No need to explicitly set Localization Codes in xml
Localization codes will follow a consistent scheme (so long as the item type is kept consistent)

Cons:
It may not be obvious to new developers/modders what the appropriate localization code for an item would be.

[Discussion] LocalizationTable Background Thread?

Issue by BraedonWooding
Monday Jan 30, 2017 at 06:40 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1768


Now I know there is a PR on the downloader aspect but what i've found tricky when trying to improve the speed of things like loading/saving of the settings menu is the biggest speed problem is the ...LocalizationTable.SetLocalization(int) where it seems to take quite a considerable amount of time. I guess it's more of a discussion about its speed then anything else. It also has a few weird occurrences and some weird here and there bits. So what do we think?

Lacking materials for object indicator/feature

Issue by BraedonWooding
Wednesday Oct 19, 2016 at 01:29 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1557


Expected behavior

  • Shouldn't allow user to 'schedule' an object to be created if you are lacking the resources
  • If for some reason an object can't be completed due to lacking resources it should be indicated with a 'red' tint or similar.
  • It should indicate the resources required for each object

Actual behavior

  • No indicator/s and can queue up objects regardless of resources.

Specs

  • User can't create a job for an object if they are lacking the resources to construct it.
  • A red tint or similar on any job that can't be completed (and a tooltip explaining why; 'can't be reached', 'lacking materials/resources')
  • A construct tooltip indicating resources x/y with x being the amount of that resource required and y being your total amount of that resource.

QuillCorp [Game Design]

Issue by Geoffrotism
Sunday Oct 30, 2016 at 05:54 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1589


I'd like to start implementing QuillCorp (QC) as an entity. This thread is mainly to answer the questions: what is it? and how does it influence us?

What Is QuillCorp?

Ideas

  1. QC is the largest business in X field.
  2. Is QC inherently evil, or just ruthlessly addicted to making a profit?

Accepted Ideas

  1. CEO is Quill18.

How does QuillCorp influence us?

Ideas

  1. We are a franchisee of QC at the start of the game. This might mean that later we can split from QC and form our own company.
  2. We are required to fulfill periodic requests made by QC. Such as:

A. Provide X amount of material or product by Y (date).

B. Have a net profit of X at the end of the year.

C. Loan a character for an unspecified time or job that has a chance of either killing off the character or the character ending up with some sort of Skill that will benefit the character.

C. Example: Character X returns with Skill gunslinger - which improves their accuracy (if we even have accuracy) or damage per shot etc.

Accepted Ideas

  • None so far.

New Job System

Issue by BraedonWooding
Sunday Oct 30, 2016 at 08:16 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1590


Outline

  • Why
    • Job system is broken
    • Better sooner than later
  • Initial Progress
    • Data structures
  • The core implementation
    • Heavily interfaced for modability/modularity
    • Manager that designates tasks
    • Characters get lists of tasks to get done (based upon a simple time algorithm)
      • After x time (or when character's finish their tasks) they get new lists
    • Manager is heavily threaded and completely modulated
      • Private singleton with static add (like my Dev Console implementation)
  • Feedback
    • (Table) Question | Current answer to question | Community accepted answer
  • Progress
    • Checklist before I create a testable PR

Why?

Okay so essentially the Job System is broken, it really needs a full re-write; and well I'm trying to do it so it'll be so perfect it'll never need another re-write/cleanup (aim for the moon so you land among the stars).

I know this is going to be a pain for other PRs, but the longer we wait on this the worse it'll get, so I'm pulling the band-aid off (so to speak).

Also I'm not going to create a PR till its testable (there will be a checklist at the end to indicate progress before PR). Also this issue took like 2 solid hours to build so be kind if like typos or doesn't fit format or whatever ๐Ÿ˜ฉ.

Initial Progress

So I'm already working on the system (super early work just getting class structures in place) and I'm building this issue so we can decide on direction and little things as well as big things.

Also I'm suffixing most classes with "" just so I don't have weird conflicts (like two Job classes) and I can slowly move parts across, then i'll do a find and replace (like replace "Job" with "Job") the double underscore makes sure that it isn't including xml or json or any text / property (which can use sometimes a single underscore).

The core implementation

Why Interfaces and Abstract classes?

I'm addicted to interfaces and abstract classes (a little too much perhaps), but I think it fits this situation perfectly; below I'll place a few pictures of my proposed interface hierarchy for the Job System.

NOTE: The layers represent inheritance (the program broke and I couldn't draw the lines), all jobs inherit from the interface above them AND BaseJob
untitled

Now as you can see it's quite extensive and VERY powerful (you could move the current state system (or other systems) to using these exact interfaces if you wanted to), so this opens up the modability a ton! So basically interfaces and abstract classes require good structure (so no re-write in future) and open doors fully to modability and nice polymorphism (casting down/up from x to y).

JobManager

Essentially what we are doing is building a manager that manages (lol) the current jobs by assigning specific task lists to characters based upon proximity (a radius from a tile based upon that character's current list of jobs), and preference.

Now why is this important?

Speed is the main reason, we can thread these processes and essentially do some early pathfinding to speed up the actual pathfinding (like using @koosemose current room pathfinding where it locates room -> room), then when the character gets the task it already knows what rooms it needs to pass and then can just do a finer optimised path (doesn't even need to find the most optimal just within 95% of the optimal path - one square slower for every 20).

Priorities

The priority system is number based, but to also have critical priorities and based off how normally managers work I have decided to implement it so the only value that matters is the absolute value of the number (its distance from zero), with a negative number indicating that the job list should be rebuilt for the character that should get that negative number. Now this is so that 1/-1 is the highest priority, 2 being the second highest, 3 being the third highest (and 0 being just add it to the end or where-ever), if you add a job of priority 2 for example, the next time the job manager is giving a list of jobs to the character it will put the job second (well like not 'second' cause there may be multiple priority one jobs but essentially after all the priority one jobs, also if there are multiple second priority jobs then which one goes where is entirely dependent on the list creation and there is no way to say 1.5 or 1.9 for example. However if you put -2 then after it calculates the most optimal character to do that job (or if you specify a character) it will grab that character and say refresh your list, the character will be given a new list of jobs with -2 being placed second in that list (with the same rules as if it was just normal 2, except it will be placed before all other second priority jobs).

If you have any questions about this (or anything at all) just pop it below, if there is still conjuncture (no definite answer) then it'll be put in the question table :D.

Modding

Now we have some standard job 'types' (classes) that will be used mainly (stuff like haul, build object, build furniture, operate, produce object, perform on furniture/tile) but these can be subclasses for functionality, as well as whole new types can be built (stuff like a hunt job could be super easy to implement) this means that later on someone could build whole new jobs (as long as they use the interfaces provided with the game).

Feedback/Questions

I'll populate this as questions pop up but I've got a few to start with

Question Current answer to question Community Accepted Answer
How could/would 'needs' be implemented with said system? You should never use jobs to figure out what to do, a job is saying go do this. So with needs what you could do is let's say you have a sleep need, so the sleep need is at 20 for Bob (with 0 being that you need sleep or dead) so you could say hey JobManager add a job (sleepyJob) with priority 2, with a preference of 0 to Bob (0 meaning that only Bob can have that job); this means that the next time JobManager delegates jobs out to people make this the second highest priority job for Bob! But now the sleep need is at 10 (due to Bob having priority 1 jobs), so you could say okay JobManager change job of type (sleepyJob) for Bob to being priority 1 (you can either pass a reference to that job or you can specify a character, or say change every job that matches this type), now this doesn't refresh Bob's list (because it's still a positive number), so Bob still doesn't get any sleep. Now his need is at 0 so he needs sleep right now, so you set sleepyJob to -1, which means interrupt Bob's current list and pass him a new list with sleepyJob being priority 1 (the highest priority, and since you are passing an interrupting priority - negative - then it will also make sure sleepyJob is the first 1 priority). No accepted answer yet.
Batch Jobs as a flag or a job class Now as the manager plans out jobs it could either detect one of two ways (both valid), first is that it detects a job as being a batch job (a flag that all jobs have) and then it searches for nearby jobs, so any object that COULD be batch has this flag turned on, it just does a quick proximity search (maybe max of 5/7 squares 2 dimensionally) then if similar jobs exist (same type of job or same job or whatever) it then will bunch them together in a new job type that is evaluated as a single job that is passed to a character without refreshing (unless an interruption occurs). The other way is that the build manager in this case would pass this new job type? Well you could do it both ways??? No accepted answer yet.
How jobs are handled/updated The old job system implementation has functions (for LUA and C#) that it calls on start/update/pause... My suggestion is having handlers that get given a IJob (base interface) with a work modifier and handle the updating, now if you wanted an UI updater than you would create an handler and then subscribe to the job's UI Update handler (every half second??). This way you would have generic handlers for Jobs and if you wanted to override it you will have to subclass that Job class but in most cases you won't need to override it at all? Or we could use the old job system implementation No accepted answer yet.
How should the preference system be implemented A weighting system of sorts (a 10 in construction may be lower than being right next to it with all the materials). No accepted answer yet.
(@Geoffrotism) Don't all jobs require a tile? Shouldn't IJobTile be part of IJob The current system is that a Job may 'regard a tile' or may 'regard a furniture' and so on, but the idea of having all jobs 'regard a tile' and some also 'regard a furniture' is also a possibility No accepted answer yet.
(@NogginBops @dusho) How should inheritance work? Two ways either a interface based approach, or a generalised approach Generalised imo (and using the previous job system as an example) in most situations is bad, you're making presumptions on how things will work in the future and what features will be added (which even if you know 100% what's going to happen can be bad for modding), which means in an open source project we need to make sure that our code lasts a long time before it needs to be re-written to allow for more functionality (otherwise every year it's just rewriting the same old stuff to allow for new stuff and you get completely unreadable hunks of mess classes like the current Job class - took me a solid hour or two just to read the 100s of functions), so it's clear we need some kind of inheritance based approach, I personally like interfaces but that's mainly because I'm using them a lot in my work, and other places so I'm a little biased.

Progress before PR can be made/tested

  • Decide on names and hierarchy
  • Create constructors and implement How Jobs are handled/updated
  • Create base and generic job classes
  • Stylecop ( doing stylecop three times so we don't end up with like 5000 violations ).
  • Implement a core Job Manager that just can create jobs
  • Implement a core Job Manager that can delegate tasks (print result and speed but doesn't assign)
  • If speed (of above) is acceptable then make the Job Manager give tasks to 'units' or whoever.
  • Units preferences based upon proximity
  • Implement units to cancel jobs (and ask for new ones) and timer to auto cancel jobs
  • Stylecop ( doing stylecop three times so we don't end up with like 5000 violations ).

--- This is far enough for testing to happen (PR request made).

Progress till finished

  • Implement XML/JSON for jobs
  • Implement saving
  • Implement some stronger modding (allow LUA/C# to create job types)
  • Cleanup, stylecop ( doing stylecop three times so we don't end up with like 5000 violations ).

Inheritance!!!

Okay so I thought I really need to add a quick section here talking about the inheritance of the job system.

Okay so i've tiered it,

  1. tier one is what we call the baseJob it doesn't inherit from anything and essentially acts as the old IJob & IJobPriority rolled into one small class.
  2. Then we have our generic classes which will then have specialised classes as the third tier. This way you may have multiple produceJobs that have different logic (maybe one takes in multiple inputs for multiple outputs and so on).

Pathfinding Improvements

Issue by Geoffrotism
Wednesday Oct 19, 2016 at 17:58 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1560


Problem

The current pathfinding system often takes a long time to find a valid path if the distance between starting and ending locations are large.

Suggested Solution

I would suggest switching to JPS (jump-point system) to do all exterior pathfinding. This method has a substantial decrease in evaluation time compared to A* and Dijkstra. One thing to note is that JPS requires uniform movement cost across tiles which is why @vogonistic suggested to use it for tiles in space. We would use A* for tiles inside to make use of the movement cost modifiers.

JPS was originally used for 2D tile graphs that allowed diagonal movement. (you can read a good summary here:
http://zerowidth.com/2013/05/05/jump-point-search-explained.html

The problem with this is that we have a 3D map and do not allow diagonal tile movement. I propose that instead of expanding diagonally until finding a forced neighbor, we expand along the X coords and expand along the Y and Z axis when looking for forced neighbors.

My reasoning has a little bit to do with the psychology of the mind. I believe most people are likely to build their space station, it will be more wide than tall. Most players in factorio build their bases spanning horizontally. Disney World in Florida was designed knowing that most people will enter the park and then turn right instead of staying straight (which is why the bridge to futureland is wider than that of the other bridges.)

This will help in the case that the distance (as the crow flies) to reach the X coord of the end point is larger than the distances to either the Y or Z coords.

Task List

  • Implement base design.
  • Split pathfinding between inside and outside.
  • Try bi-directional searching.
  • Add handling for cases where there is no valid path.

How realistic should Project Porcupine be?

There are two types of realism that games can take; the first being 'gamified realism' where often a trend of data or a dynamic is expressed through a simplistic relational formula rather than a set of laws and formulas, an example of this would be to express temperature as a relational of kinetic energy / total gas. I couldn't find any location where this was even hinted at being a simplification or being real however it does provide nice results that work quite well.

Now the second way is a simulated environment where it represents idealistic realities (basically avoids any complex 'realities' like air resistance, friction, quantum mechanics and so on... often called classical/idealistic physics). This would be quite easy to achieve (though 'easy' is a relative term very much so in this case) we would simulate gases and solids as temperature holders, and what would happen is that gas would hold the atmospheric temperature for that room very much so like it currently does, most likely I'll change the equation a bit so it works nicer with less variables but it essentially will be the same (since it works so well), then the system will add flow rates (which is an inverse relation see below) based off the gas's molecular mass, this could be used for effusion/diffusion speeds and there are ways to compare different gases.

image

So every entity (furniture/machine/human/robot...) will face a temperature of the gas temperature in the room (very much like the current situation) however I would propose that we include the realism that not every object heats up as much as the next, and like the current system which has a thermal_diffusivity value we probably should have a relation to heat transfer/convection. So if you have a lot of metal in a room that room will be cooler since the metal will act as sinks (which is true and helps for spaceships which generally are quite cool due to the mass amount of metal), however if a machine is really hot it'll be a lot less efficient (and perhaps not accessible by humans due to its heat acting as a threat). What do you guys think?

Body Parts

Issue by Geoffrotism
Tuesday Oct 11, 2016 at 20:29 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1528


Being able to add prosthetics were briefly discussed in #1040.
I would like to add body parts as a solution to this as well as being the foundation for other potential features.

The design I had in mind was that every character gets a Race, each Race has multiple body parts determined by reading an Xml file. The reason i think this is appropriate is that, other than mutations, every human has 2 hands, 2 feet, 1 head etc. and each Alien species would have X amount of limbs.
My example of the xml is:

image

@dusho made a suggestion that we add "position = left/right/center" attribute that I think would be a nice touch. That way making left and right hands would be super easy.
I would add to this by changing "name" to "type" in the Xml and then creating the name at runtime by combining the two strings.

This system would also make Race specific features possible. If you want all characters of Race X to have a bonus to carrying capacity you could add a Strength modifier. Alternatively, let's say that this character then had all of its hands shot off, there could be an easy check on all the limbs with type = hand and check if either the health of that limb = 0 or potentially add a "isBroken" or "IsMissing" property that when change runs an update command that re-evaluates a method in Character that calculates various properties of that character.
@MANDAL0R3 as he wanted to help work on this.

Possible way to handle connecting to utilities from a distance.

Issue by koosemose
Tuesday Mar 07, 2017 at 04:39 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1787


Currently, for a furniture to connect to a Utility, it needs to have the wires ran directly to the furniture. In the past, people have stated a desire to have furniture connect to Utilities from a distance (similar to Rimworld, for reference).

I have however been reticent to implement this for two reasons.

First, I personally find the autoconnection awkward and somewhat annoying to use particularly when trying to either maintain separate networks or keep certain furniture connected to only a certain portion of a network (such as in rimworld keeping all turrets connected to the other end of a switch), at times requiring awkward placement, and deconstruction and rebuilding of your wires when they don't run in just the right way.

Second, I am not confident in the combination of my coding skill and the PP framework to implement a system which will mimic Rimworld in allowing any powerable furniture to connect to any power cable within a given distance, and not have noticeable performance dips on placement of furniture and wires as they search for things to connect to.

However, as a solution to both these problems, and still at least partially satisfying those who want "easy" connections, I think having it in a limited form may work. Basically the idea is to have some sort of "outlet" object (rather a furniture, or a sort of Utility, depends on what works best) which is the only object capable of the ranged connect. This would mean not every wire has to search only this specific object, and if is implemented with some form of master list of all outlets, it would simplify furniture searching, as rather than having to either search every tile within, for example, an 8 tile range, or check every utility cable for closeness, it could just check the much smaller list of outlets to connect to (or maybe it could use some sort of signal through the tiles it covers, so rather than either one searching, the outlet just "notifies" the tiles they're in it's range, and either it can in turn notify any furniture presently there, or new furniture placed down will be able to check what outlets it is in range of.

There's room for additional mechanics around it as well (though I haven't heavily considered the implications thereof, they're just random ideas), such as having it either serve the entirety of a room (I think that would probably be bad, as it might lead to power gamers making the base one giant room to save on wiring), or serving a single room and only within range (mimicking an outlet on a wall in real life), and if it's in a wall it will be able to be set towards one room or another (or it is unplaceable in a wall).

Is the OverlayMap a user tool or a developer tool?

Issue by koosemose
Friday Feb 10, 2017 at 05:33 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1779


The titles for the different overlays imply that it is meant to be a user tool (since some are marked as Debug), but how useful is it really as a general player tool? While it could be used by players, most of the information that would be useful is available elsewhere or could be made available, and for a player facing tool it is subpar, mostly as a matter of performance, there are obvious dips when it has to rebuild the overlay, and in addition the refresh rate feels much to slow to be something player facing.

If it is a developer tool we should make it clear that it is (even if it as simple as making the dropdown togglable off in a debug setting or something), so that future developers don't use it as a way to convey important information to players. If it is a player tool, we need to drastically improve it's performance, at least make it so that rebuilding the overlap map doesn't take so long causing a severe performance hit, and if possible improve the refresh rate somewhat.

Need Create Job UI (Smelter and other machines)

Issue by vogonistic
Thursday Sep 01, 2016 at 23:45 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1082


We currently don't have a default build screen. Does anyone want to give it a go to build one? Most options aren't relevant to the current job system, but they can be added over time in the new job system which is more flexible.

I'm attaching a screenshot from Rimworld as an example of what it looks like in there. Does anyone have other good examples?

rimworld build statue

To the left is the list of existing jobs that have been created with some overview information. To the right is the details you can configure on your job.

Repetition of code in various animation systems

Various prototypes that have animations (TraderPrototype and Furniture) bothhandle processing the Animation xml themselves, in slightly different ways, even if though they use the same options. This could be simplified by having the ultimate Animation objects (SpriteNameAnimation) be passed the relevant xml, and processing it itself. This would also allow us to more clearly establish reliable default values (in the case of fps it seems to be 1, but all it takes is one person not paying attention and setting a different default in their ReadAnimationXml to suddenly give us inconsistent defaults. It would also allow us to shorten both classes.This leaves room for inconsistent coding when things are changed to cause bugs (such as #66).

Additionally Furniture uses FurnitureAnimation which primarily functions as a collection of SpriteNameAnimations with a few helper methods to ease use (compared to TraderPrototype, that has two separate SpriteNameAnimation variable, and presumably it and its SpriteManager handle what FurnitureAnimation does for Furniture). FurnitureAnimation only has one line that is Furniture specific, as far as I can tell, and that being very simple (Renderer.sprite = SpriteManager.GetSprite("Furniture", spriteName);). It shouldn't be too hard to retool this to a more generalized class for... Animation sets I suppose you might call them, (or maybe just Animations to line up with the xml name).

Character also uses a somewhat similar CharacterAnimation, though it isn't a prototype and so doesn't need to read xml, and it does have a fair bit of Character specific code, on top of the code shared with FurnitureAnimation, so perhaps it could be retooled as a subclass of FurnitureAnimation (after it gets changed to be more general).

[Discussion] Storyline!

Issue by WardBenjamin
Saturday Aug 20, 2016 at 17:47 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#431


For a while we've had some kind of basic story outline (See #263), something along the lines of Story

Basically the concept is that you get screwed over by QuillCorp, and stranded with no fuel and only a basic drill and power source, and your smallish station.

Any discussion? What does everyone think about this?

Let's get the ball rollin'!

Change TileType to Flooring, and change to function more like other buildables

Issue by koosemose
Saturday Oct 08, 2016 at 19:00 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1522


Currently TileType is just still has many holdovers from having been an Enum, and this causes a need for lots of special cases and odd workarounds to achieve similar behavior to everything else we build. I propose it is changed to Flooring and made a proper Buildable object like pretty much everything else we build. While I suspect this will require a lot of changes, it should also allow future features to be easier to develop, and lead to cleaner code in the end anywhere we currently deal with TileType.

UI Redesign

Issue by bjubes
Wednesday Oct 05, 2016 at 01:25 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1500


List of UI elements to redesign or consider changing to make the UI consistent

  • The trade dialog.
  • The headlines.
  • The construction menu still needs some work. Changing the filter and the buttons.
  • The settings menu needs some new input designs.
  • The bottom menu doesn't look as good in my opinion. The original design was different.
  • The right menus could be different. They use the construction menu design, but doesn't look as good having 2+. we might go with a different type of UI on the right.
  • . The quest list at the top left.
  • We could make the inventory UI nicer.
  • The overlay popup could have a different color.
  • The input in the save and load dialogs needs to be changed.
  • The X button to delete files should look like the one in the job list. We can then remove the sprite.
  • Quest Dialog

original issue: This was discussed on discord, but putting it in GitHub for formality. The Quest Dialog UI is the only remaining old UI element, so it should be updated to finish the full UI redesign.

ping: @TomMalbran

Art Style?

Issue by BraedonWooding
Monday Jan 16, 2017 at 01:42 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1758


I just feel that a discussion on the art style could help those who are building art (a few of us, admittedly I'm pretty terrible at it and really I can only throw a half decent prototype) to understand the art style this project is going for (visual, positioning, theme and so on...).

Positioning

Now there are a few art positioning style we could go for (in these examples it's about the perspective not about the theming nor the style):

  • Top down with elements acting as if they were 30-45 degrees from player.
    image
  • Full top down (bird's eye view)
    image
  • Slightly tilted full top down (a few degrees down wards from bird's eye)
    image

Style

  • Pixel
    • Low count (sometimes called 16/32)
      image
    • Medium Count (sometimes called 64)
      image
    • High Count (sometimes called 256+)
      image
  • Cartoony
    • Simple 'flash like'
      image
      or
      image
    • More pixel based with a cartoony undertone
      image
  • Hand draw like
    image

Theme

  • Sci-fi like
    • White / Blue
    • Pristine condition
  • Lovecraftian
    • Darker
    • Alien feel
  • Ragged space station
  • Religious (not partaking in any specific, but things like rituals and maybe a made up religion)
    Note: I quite like the mixture of sci-fi and lovecraftian; a major sci-fi feel with a little 'lovecraftian' to show the effect of time on things, as little wear and tear happen in walls and enemies become more horror like as they use more drugs (or whatever), with maybe a little bit of a lonely spaceship feel :D.

Anyways I feel like art should help guide a game's development and is fundamental to design decisions (such as my tear and wear suggestion above or drugs affecting appearance and so on...) and by defining this we can confirm the positioning (that is commonly done wrong by accident) and update the Art Assets side of the Wiki to help any artists understand our direction :D.

OverlayMap UI error

Issue by bjubes
Thursday Feb 09, 2017 at 00:25 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1777


OverlayMap.cs around line 570 has the following:

colorMapView.AddComponent<UnityEngine.UI.Image>();
colorMapView.transform.SetParent(parentPanel.transform);
colorMapView.AddComponent<UnityEngine.UI.Text>();

and Unity complains:

Can't add 'Text' to New Game Object because a 'Image' is already added to the game object!
A GameObject can only contain one 'Graphic' component.

currently its only using an image, are there any problems with this UI as a result? either way this has to be fixed or the AddComponent<UnityEngine.UI.Text>should be removed

Positional Sound

Issue by Jaytheway
Monday Oct 24, 2016 at 07:20 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1576


Expected behavior

Sound should play from the position of its emitters.
Unity has this capabilities. Not sure to what extent they're applicable in our situation.

  • Min Distance Within the MinDistance, the sound will stay at loudest possible. Outside MinDistance it will begin to attenuate. Increase the MinDistance of a sound to make it โ€˜louderโ€™ in a 3d world, and decrease it to make it โ€˜quieterโ€™ in a 3d world.
  • Max Distance The distance where the sound stops attenuating at. Beyond this point it will stay at the volume it would be at MaxDistance units from the listener and will not attenuate any more.
  • Rolloff Mode How fast the sound fades. The higher the value, the closer the Listener has to be before hearing the sound. (This is determined by a Graph).
  • Logarithmic Rolloff The sound is loud when you are close to the audio source, but when you get away from the object it decreases significantly fast.
  • Linear Rolloff The further away from the audio source you go, the less you can hear it.
  • Custom Rolloff The sound from the audio source behaves accordingly to how you set the graph of roll offs.

As I understand, Custom Rolloff is not an option.

Unity Manual page for the reference: https://docs.unity3d.com/Manual/class-AudioSource.html
Unity Scripting API: https://docs.unity3d.com/ScriptReference/AudioSource.html

Actual behavior

For now sounds play exactly in the center (in a 2D space (where the camera is)) ignoring position of the emitter relatively to the camera.

Examples:

  • If aliens attack from the north, you would hear sound directly in your face.
  • If the fire started you would hear the sound in your face, without any directional indication.
  • All furniture placements - in your face.

All this resolves not only in an aesthetic nonsense, but also in a muddy mix. (Especially without any means to mix audio)

Steps to reproduce the behavior

  • Step 1: Get positions of sound emitter and camera (perhaps, the tile, which is directly below the camera)
  • Step 2: Calculate the distance between sound emitter and camera
  • Step 3: ...

Also in Uniti Scritping API there is: "You can play a clip at a static position in 3D space using PlayClipAtPoint." It might be a way to do it(?)

Related issues

This is one of the basic features that our sound system need listed here: #1535

I am by no means a programmer, so:
-If you know how to do it
-If you are willing to put time in something that will determine how the game feels
-If you feel strong about it, as I am listening to the "Nerevar Rising" from the Morrowind's soundtrack!

Sign up!

Put your name on the pedestal of glory!

Pedestal of Glory

@longtomjr

@koosemose

(names of all contributors to the Sound Engine will be listed here)

[Discussion] Storyline!

Issue by WardBenjamin
Saturday Aug 20, 2016 at 17:47 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#431


For a while we've had some kind of basic story outline (See #263), something along the lines of Story

Basically the concept is that you get screwed over by QuillCorp, and stranded with no fuel and only a basic drill and power source, and your smallish station.

Any discussion? What does everyone think about this?

Let's get the ball rollin'!

Extend/Replace Localization code

Extracted from #80 :

The later you start the worse it gets.... e.g. Quests is hardcoded in the data and Inventory has "too many" keys. The projects I localize work with a yaml-styled language file (the ruby-lib is called i18n). So you dont have key-value pairs but a whole tree structure. So it would look something like:

en:
  Inventory:
    raw_iron:
      name: "Iron Ore"
      description: "Raw Iron Ore, it needs to be processed before it's useful."
  Quest:
    "Mining Drone Beta Test Program":
      Name: "Mining Drone Beta Test Program"
      Description: "Participate in the Beta Program of brand new mining Drones!"

No need to define some localization keys inside the data. My translation method then accepts an path to the string like: translate('Inventory.raw_iron.name') or translate('Inventory', element.get_name, 'name') I don't know if there is something similiar in C# / Unity but it

@koosemose: I wouldn't be opposed to a system that works like that, if it can be done in a performant way (having to parse a string like that with regularity might be bad, since a lot of this stuff is ran for UI updates, which means every frame). I would advise putting that forward in an issue of its own, but unless you think you can implement it, the chance of uptake is low

Well this is the topic - I certainly have not enough time to do it myself but as I think its important I created it, so whoever reads this - feel free to pick up the task and provide an PR.

In a quick google-search I found this: https://github.com/MoonGateLabs/i18n-unity-csharp. Not exactly what I meant and not updated for 2 years but covers some stuff you have to think about so a good starting point - might be even worth as base/fork for the needed extension.

Need assistance in reviewing converted Data files (json from xml)

For those not aware, I've recently been working on coding a tool to autoconvert our prototype data files from xml to json (rather than doing it by hand or using a generic xml to json tool so that the structure is consistent and can minimize cruft from the xml files that isn't needed for json).

I believe I have completed the conversions, however, setting up the json reading will require changing structure in a few places (where things were structured to follow how the xml was laid out and that same structure makes things extremely awkward at best or impossible at worst for reading from json), and that may lead to destroying the converters ability to read xml (as it is easier to test reading from a dedicated tool than in PP).

Before I head down that road (that may be difficult to reverse, and extremely difficult to do without some potential destruction), I would like to ensure I've got the data files fully converted, without leaving any data out. To do that, I would like help, extra eyes on things to ensure that nothing is missed. So if others could look things over and compare the files to their xml equivalents, it would help me proceed to the next step much faster.

For the smaller files I only really need one extra set of eyes, but the larger ones (furniture in particular) multiple extra sets would ensure I don't lose data and add a lot more time to the process. So if folks could look over some, and post which ones they've reviewed (If any missing data is discovered, I only need to be aware of one instance of it, since it's automated if one is in error or missing, all will be in error or missing, and fixing it should fix it for all

Note: Any not marked that have already been reviewed, I either have not yet had an opportunity to update, or in the case of a complex file, deem it to require further review due to complexity (this primarily being furniture).
Note 2: The comment of Requires further Attention is a note to myself that a file that has been looked at has some concerns that I need to address, and an updated version of it will be reuploaded for further review after concerns have been seen to. If you have reviewed something, and had concerns that I didn't account for in a reply and it hasn't been marked as Requires further Attention please let me know, I may overlook things from time to time.

Note to self: Investigate empty template in comment at top of files.

Note to self: Review jsonDefaults for all values, keep eye out for nonvector2 coords, and either convert to vector2 or ensure defaults are defined in such a way as to have 0,0 default for the entire object, rather than 0 for x and y being defaults independently.

Discussion: Map Generation

Issue by WardBenjamin
Friday Aug 19, 2016 at 18:47 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#306


Right now our map is generated exclusively with Unity's built-in Perlin noise. Perlin is pretty slow, compared to other coherent noise algorithms such as Simplex noise, and isn't really extensible.

I want to change our map generation to use LibNoise, a very nice noise library for C++ which Ricardo Mendez has made into an extremely nice Unity/C# port: ricardojmendez/LibNoise.Unity. Not only with this can we do fancy things like biomes, we can also layer LibNoise modules together to come up with some extremely cool terrain. Check out LibNoise Tutorial #5 for an example.

Are we in favor of this? Any other solutions?

Discuss!

Quick action bar

Issue by vogonistic
Tuesday Oct 18, 2016 at 23:50 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1555


It was suggested by @Tranberry in #1552 to add a spotlight/alfred like quick action bar. This issue was created so we can discuss it in more depth.

Spotlight GIF

Ideas

  • Find character and see detailed stats on them
  • Find furniture and their stats
  • Jump to specific location or room

Altering SpawnInventory UI to only show amounts that can be spawned

Issue by koosemose
Saturday Feb 04, 2017 at 00:41 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1773


Currently the SpawnInventory UI will always show the standard 1,20, 50 for amount of an Inventory that can be spawned, but (appropriately I believe) will only spawn up to the max stack size), however, this does have a potential for confusion, as if someone clicks on, for example, the button to spawn 50 power cells, they would reasonably expect to be spawning 50 powercells not only 5.

So, while working on another PR, I toyed with making it not display options higher than it can spawn, and if it's max stack size is less than 50, have one button for the max stack size. Basically having what the UI shows match what it will actually do (and less buttons that do the same thing for things with really small stack sizes.

This is what it looks like (also with localized names, because that's the PR I'm working on):
image

Suggestions for renaming of Localization related fields

Issue by koosemose
Saturday Feb 04, 2017 at 05:50 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1775


Currently the localization related fields are LocalizationCode for name, and UnlocalizedDescription, which feels inconsistent, and in the case of the first a bit obtuse, and the second just a little awkward sounding.

In my inventory localization, due to momentarily forgetting what names were already in use, I used LocalizationName and LocalizationDescription, which are more consistent, and seem more obvious and direct. I suggest we change to these names (or if anyone else has better suggestions, then those).

Additionally, there are a few related functions which seem a little awkward, the one I recall is, I think, GetName, which @dusho pointed out. Perhaps GetName should return the localized name (so GetName on an o2 gen would return "Oxygen Generator" (or whatever's appropriate for the language) rather than "oxygen_generator", and have a matching GetDescription, and leave getting the unlocalized form to the Properties.

[Discussion] Combat

So the area that development is going towards is currently character needs and other 'character stuff', since that's pretty light right now (and a lot of it is 'todo'). So I've been thinking that a conversation on the combat of the game could be beneficial (since the whole set of 'character systems' should be built in mind of each other.

A common problem with strategy games like PP (rimworld, dwarf fortress and so on), is combat, often it's badly balanced since without the right weapons (for a game like rimworld) you can lose easily and with good weapons it's an easy victory. Little to no tactics are often used by players or NPCs since they are often irrelevant, moving your units is clunky and this is mainly due to pathfinding never being perfect to what the player wants (and in 90% of cases that's okay especially in 'build mode' but in combat having a guy walk 10m in front of an enemy or walk a slightly wrong tile can be annoying and cause death). So both of these 'possibilities' that I came up with deal with this core annoyance by suggesting a different combat mode.

So based on this I drafted up two types of combat that our game could use, the places that you would partake in combat could be stuff like ship invasions, planetside battles, doesn't really matter. In both cases its top down combat 2D sprite combat, the benefit of having it this way is to reuse assets and consistency (same map showing code for example).

X-COM like Combat

Essentially every character has a list of actions they can partake in (like shooting/moving/throwing a grenade and so on) in the earlier versions of X-COM characters could perform actions based upon a stat where certain actions would use more points than others. Other than that you basically gain new abilities by levelling up and giving perks (something that characters have been planned with having for ages) and those abilities will either be passive (mainly stat gains) or active (activatable actions that produce an effect; like a rocket or a heal). This fits in quite nicely and requires strategy and skill.

This is probably the 'better' choice even though I prefer the other type. The benefit of this type of combat is that it uses your whole squad, is faster to load, and fits more with the theme. The negatives of this 'solution' is that it requires more complex enemy AI, stuff like 3D 2D terrain (a layered 2D map) is harder since destructibility will surely be part of it and so having to handle 3D pathfinding like climbing up and dropping is more difficult (and may not fit into our current system), also shooting most likely will be a 'chance' and that could create annoyance (though often it does the opposite).

Isaac/Gungeon/Nuclear Throne like Combat

In this type of combat you control a single character (most likely a leader or whatever) and in a shoot-up style of combat fight of enemies. In this case like with the above solution you have abilities (though often not as much and it's more revolved around your 'shots'), often these games have RNG and other variants, and while we could include it through drops and so on, I think it would be best to avoid and make it revolve around your skills. Often these types of games are much more difficult and less controlled than X-COM initially then get moderately easy.

The negatives is that to make the style work you can only really ever control a single character, a way to make the others feel more important is adding abilities to use them such as sending them forward to weaken enemies or heal you up. Also it fits less with the theme and style of game, however this is not bad since it could act as a polariser to the rest of the game, such that it feels like a break rather than a side annoyance. The positives also are the fact that AI is easier and simpler, and that generally it's easier to code and maintain, and we don't have to worry about 3D terrain since destructibility isn't part of these types of games (nuclear throne is an exception), and ladders will still exist of course to carry you down.

Now these are just two 'solutions' that I have derived if you have any others or comments just comment below or whatever. In all solutions permadeath should be a fundamental influence on the gameplay!

[Discussion] [Game Design] World Generator Same Seed, Different Size = completely different world

Issue by Dan54
Friday Jan 27, 2017 at 16:37 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1766


Actual behavior

Using the same seed but a different size generates entirely different worlds.

50X50X5 with seed 20
50x50x5 seed 20

51X51X5 with seed 20
51x51x5 seed 20

Steps to reproduce the behavior

Generate two worlds with different sizes and the same seed

Alternative behavior

Using the same seed with a different size generates a similar world

Tiles still use BuildingJob

Tiles still use BuildingJob which has been effectively replaced with OrderActions, this should likely be updated to use OrderActions (unless there is some technical reason that says otherwise), I'm not certain without examining the code if the existing Build OrderAction will work for tiles, so it may be possible a new OrderAction needs to be created (but it may not as well). If this is the last place BuildingJob is used, then we may wish to investigate removing BuildingJob (or whatever the attached class is named), unless there is somewhere not directly connected to the prototypes that it is used (and even then we should investigate upgrading to an appropriate OrderAction).

[Discussion] Starting ship changes and crew members (among others)

Issue by BraedonWooding
Thursday Jan 12, 2017 at 10:56 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1751


  • Possibly make it not just single select, so you could have a mining/tourism/trading/raiding base, but your applicant pool size is preset, so choosing multiples dilutes your pool for each
  • You pay for the elements of your start so if you take a crappy start on a crappy base with crappy crew, you have tons of money because you didn't spend a thing on any of it
  • On a related note, it has also been discussed in the past, to not have all traits automatically known, so you may not know the guy you hired for an engineer is also a pyromaniac, because who puts that on their application... and be able to find these things out in-game (better hire a good psychologist)
  • Pool of unrerollable crew, better ones cost more
  • Can buy things like uninstalled smelters
  • I'm also really fond in general of the idea of having psychology be a legit (and very important) skill in the game, not only to figure out all of your crew's traits, but instead of the rimworld route of if you don't do a perfect job keeping everyone happy they eventually snap in some random way, you can actually (if you pay attention) send them to the psychologist to get over it.... of course if they're bad they make things worse... Then there's the risk of your psych having extremely bad traits, but that could be fun, like ending up with a psych who is actually subtly influencing your crew to do all these horrible things
  • cthulhu element that causes insanity. Like the actual lore
  • Multiple factions, that the player can ally/betray/fight
  • Can send gifts of sorts or do quests for factions
  • Faction rewards can be monetary, access to faction secured sectors, different quests, maybe a 'victory'...
  • Different starts favour different factions
  • Your choices are impactful

Bug in ReadAnimationXml

Several classes have a ReadAnimationXml method, (to read the Animation section of their xml data file), which has the following section of code:

                    float fps = 1;
                    float.TryParse(animationReader.GetAttribute("fps"), out fps);

The intention of the code is fairly clear (especially when one looks at some of the accompanying data files), the expectation seems that if the fps isn't set (or is set to something meaningless such as something non-numeric) it will default to an fps of 1. This will work if the fps is non-numeric, however in the much more common situation of not having an fps attribute animationReader.GetAttribute("fps") returns null, and TryParse set fps to 0 on null, meaning this doesn't work as expected (There is a chance this is due to version differences in .Net, as I discovered and tested this in my converter project which uses a more recent .Net, but I doubt that is the case).

There is also the semi-related issue that the attribute/variable is here (and in the xml) referred to as fps but in the resulting object (ultimately SpriteNameAnimation) it is Delay. I haven't investigated to ensure which name is the most accurate to how it is actually being used, but I suspect Delay is the correct intention, as it's use is closer to the actual usage of the number in code, and because, if it's being set to 0 in some cases, if it was being used to calculate the actual delay from fps, it would almost certainly cause an error, which we haven't seen.

One partial cause to the bug and lack of clarity in the attribute may be due to the fact that various prototypes that have animations all handle processing the Animation xml themselves, in slightly different ways, even if though in several cases they all use the same sorts of options. This could be simplified by having the ultimate Animation objects (SpriteNameAnimation, though I haven't looked around the codebase enough to be sure there isn't another alternate version) be passed the relevant xml, and processing it themselves. This would also allow us to more clearly establish reliable default values (in the case of fps it seems to be 1, but all it takes is one person not paying attention and setting a different default in their ReadAnimationXml to suddenly give us inconsistent defaults. It would also allow us to shorten several IPrototypable classes.

Further bugs may be included in this as I continue to work in and around the Animations.

Music style/feel for Project Porcupine

Issue by longtomjr
Monday Aug 22, 2016 at 19:41 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#631


This is a discussion thread to try and figure out what music feel and style we want to go for. I just want the PPMusicians to know what style and feel to have in mind when composing and playing.

Here is my first improv track. I just wanted to put something on tape. This is just to see if this style resonates with the team. https://soundcloud.com/longtomjr/space-in-time
It was inspired by the Bastion OST.

Don't be afraid of anyone's feelings, at this time we are just trying to get a feel for what we want to go for.

GUI Visual Indicator for layers

Issue by BraedonWooding
Tuesday Oct 18, 2016 at 04:41 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1552


Specs

  • A visual GUI indicator for the current layer as well as underground layers.
    • Underground layers will be darker
    • The current layer will be a pastel like colour (I chose a red)
    • If the current layer is an underground layer it will be a darker version of the pastel

asset 1

The above image was a rough 10 second Illustrator sketch of what it could look like. Maybe we also have an indicator for the base level?

@koosemose the GUI Visual Indicator that you wanted me to draw up

Milestone 0.3 - Putting Astronauts to Work

This milestone is all around stabilising the systems in place while also adding a new job system!

Job System

  • New Job System
  • Add better priorities
  • Job system pathfinding to tiles that can't be reached- Needs to be improved!

XML to JSON

  • Finish XML to JSON conversion.
  • Remove all remnants of XML

Multiple map locations

Issue by vogonistic
Saturday Aug 20, 2016 at 06:27 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#353


With the grand exception of Dwarf Fortress that has z-levels, most tile based games only have a single map and location.

I suggest we decouple the tiles and map data from our World object so that we can have multiple locations.

All locations would run their simulations all the time, but we only show one. It will allow our brave and probably soon to be dead (space-dysentery?) crew to embark on mining, trading and other missions. We can add a new map locations and allow the user to switch between the different locations at will. We could even use it to add more z-levels to the astroids, in case we want to go the direction of space dwarfs.

I feel that it brings something new to this genre and I'd love to figure out what we could do with it.

What do you guys think?

[Discussion] Dirty Flags and Invalidation of Cache System

Issue by BraedonWooding
Wednesday Mar 08, 2017 at 06:09 GMT # Sample: Friday Sep 13, 2013 at 22:58 GMT
Originally opened as TeamPorcupine/ProjectPorcupine#1788


Currently if you want to make something reliant on a setting but don't want to do a getSetting every second (aka cache the setting) then you have to edit that settings code to tell you to get the new setting (or do a timing system), this is just a simple example that hopefully illustrates the problem we have, this is a problem that is less relevant for settings (since well timing is at very least a semi-reasonable setting, and if you build the settings yourself you can implement them to trigger your stuff), BUT for a lot of other situations it isn't, this includes pathfinding, jobs...

So I thought what if we implemented a dirty flag system, it would essentially consist of a big enum (and most likely would actually not be an enum but be a similar system so modders could add items, or it would be a precomputer/compiled enum + postcomputed/runtime 'enums') then we could apply bitwise operators (& / |) to chain the enums this could allow users to just essentially do integer operations to check if their flag has been pressed (and we could even implement filters on our end and an array of actions or dictionary of filter to array of actions or whatever).

So I kind of want to gather some discussion on what people think about this? Most likely it would just be a call or xml/json/skon file to hookup to the flag system which would just be a single event (or us simulating that through an array of actions linked to dictionary or whatever) called something like 'InvalidateCache' (though as per with almost all our functions the name isn't important but that is a quite a good name especially for our side), and it would have a signature simply like void InvalidateCache(int cacheFlags). LUA has bitwise so it's not harder/easier to use C# (and actually would be easier with LUA since it has a little more support for runtime enums, since they are implemented as tables).

So wait how would you interface with this? Well I was thinking you would just tell the system that this flagged has changed (i.e. CacheFlags.SetFlag(Flags.SettingsChanged, true)), then the system would do an invalidation cache next frame (or maybe next second tick), but obviously you could also trigger an invalidation cache by maybe doing something like CacheFlags.TriggerInvalidationCache() (again these are just some placeholder names to get across meaning). Then it would go out and tell everything that has filtered to receive the values to update. Then after it'll flip back all the flags, most likely to avoid weird mismatches of updating flags, it will get the current flag values by & all the flags that are true, then it will turn them all to false, then it will do the call with that value calculated.

Anyways what do you guys think? This system could boost performance and cleanup code, it could also help things like pathfinding (maybe each room has an 'enum value' then when a change occurs in a room it dirties pathfinding for that room?).

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.