Dev the Devhttp://dacharya64.postach.io/feed.xml2018-11-06T02:57:55.235000ZWerkzeugGSoC: Final Project Wrapuphttps://dacharya64.postach.io/post/gsoc-final-project-wrapup2018-08-13T15:57:25.568000Z2018-08-07T20:35:38ZDevi Acharya<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;"><strong>Final Project Report: Google Summer of Code</strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><br clear="none"/></strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong>Project page:</strong> <a shape="rect" href="https://summerofcode.withgoogle.com/dashboard/project/5117145273335808/details/" target="_blank">https://summerofcode.withgoogle.com/dashboard/project/5117145273335808/details/</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong>Project board:</strong> <a shape="rect" href="https://github.com/orgs/Terasology/projects/11" target="_blank">https://github.com/orgs/Terasology/projects/11</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong>Blog posts: </strong><a shape="rect" href="http://dacharya64.postach.io/tag/google-summer-of-code" target="_blank">http://dacharya64.postach.io/tag/google-summer-of-code</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong>Github Repositories: </strong></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong>Light And Shadow: </strong><a shape="rect" href="https://github.com/Terasology/LightAndShadow" target="_blank">https://github.com/Terasology/LightAndShadow</a> -- The main module for the GSoC project</span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong>Light And Shadow Resources: </strong><a shape="rect" href="https://github.com/Terasology/LightAndShadowResources" target="_blank">https://github.com/Terasology/LightAndShadowResources</a> -- Art resources for Light and Shadow</span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;">Project Overview: </span></div>
<div><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif;">This project builds upon the existing Terasology game engine, creating a Minimum Viable Product (MVP) for a Capture the Flag game mode in Terasology's <a shape="rect" href="https://github.com/Terasology/LightAndShadow/" target="_blank">Light and Shadow module</a>. While the module already had some work done on it, including much discussion about the module's <a shape="rect" href="https://forum.terasology.org/threads/light-shadow.766/" target="_blank">implementation</a>, <a shape="rect" href="https://forum.terasology.org/threads/las-light-and-shadow-art-discussion.762/" target="_blank">aesthetic</a>, and some art completed in Light And Shadow's <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources" target="_blank">art and assets module</a>. </span></div>
<div><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif;">I looked at the existing module and how to add a Capture the Flag game mode that fit with the aesthetic of the world as well as one that was fun and functional. To that end I created a new world generator that created a simple world for the Capture the Flag game mode with two bases, flags, and let players steal flags from one another and score.</span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;">Completed Work: </span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><span style="font-size: 14px;">World Generation: </span></strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">To begin, I created a simple world generator that would hold the Capture the Flag bases and flags. The module had a previously created platform that players would spawn at, so I included this in the new world generator for players to spawn into the world. </span></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">The world consists of a flat plane with two bases (colored red for the red team's base and black for the black team's base at some distance apart, with a flag that appears on each base. For the floating platform that the player spawns at, I created two teleporters (red and black) that the player could use to choose their team and teleport down into the world. </span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"> </span><div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/48c2ae3d-7e9b-4ec4-8c73-db8fb27aa5bc/de5184e1-2ff7-4910-942f-bad21b69d434.jpg" /></div></div><div style="text-align: center;"><em>The player's spawn platform, with a talking NPC and red and black team teleporters</em></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">The basic idea in world generation and item placement is to define the region in which specific blocks should be placed, and then to place blocks in that region with a rasterizer. </span></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">For instance, BaseProvider (part of the system used to create the bases in the world) defines a specific region for the base:</span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/c4ee857c91c93a664666ba41634dc9f9.js"></script></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">with BASE_EXTENT being a set value for how many tiles wide the base is from the center. Then the BaseRasterizer fills in these regions with blocks in the world generation for the red and black bases: </span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/7c7863dcc709c165f7350eb0e5c26727.js"></script></span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/48c2ae3d-7e9b-4ec4-8c73-db8fb27aa5bc/0535a9df-f9b2-4df1-a47d-d8a7a09f3d81.jpg" /></span><br clear="none"/></div>
<div style="text-align: center;"><span style="font-family: verdana, helvetica, sans-serif;"><em>Red and black bases placed into the world</em></span></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><em>Pull requests: </em></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Simple World Generator and Base / Flag Generation: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/issues/64" target="_blank">https://github.com/Terasology/LightAndShadow/issues/64</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Changes base blocks to be red/black depending on base instead of gray stone: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/30" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/30</a> </span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><span style="font-size: 14px;">Teams and Attack Mechanics: </span></strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Next I focused on one of the core aspects of the game--being put on a team and being able to steal the flag. </span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Teams are handled through a component added to the player at game start called LASTeamComponent. This component holds information about the team the player is on, in this case a String with the team of the player (ex. "red", "black", "white"). By default, the player begins on the platform as the white (or neutral) team, which is added to the player on game start through a delta of the player.prefab which defines the String "team" of the LASTeamComponent: </span><br clear="none"/></div>
<div><pre xml:space="preserve"><span style="font-family: verdana, helvetica, sans-serif;">"LASTeam" : {</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif;"> "team" : "white"</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif;">}</span><br clear="none"/></pre></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">When the player chooses a team and teleports into the world, the team field of the component is changed to the relevant team:</span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/b41c647d9232bad9beda98257c28dcfb.js"></script></span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">On teleporting down to the world, the player is also given a weapon with which to attack other players, and the player model is reskinned to match their team selection (from a white pawn to a red/black pawn). For the weapon, I created a magic wand item for players to tag one another. If the opposing player is holding a flag, the flag is dropped between the attacking player and the target player (removed from the target player's inventory and placed into the world). The first player to touch the flag picks it up. If a player from the same team as the flag being picked up takes the flag, it is sent back to the team's home base. </span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif;"> Being able to pick up the flag from the base is handled through a component on the flag (TakeBlockOnActivate). The TakeBlockOnActivationSystem checks when a player activates the flag (pressing E) to see whether the team of the flag is different from the team of the player, If so, it removes the flag from the world and places it in the player's inventory:</span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/17848917a7862879c12e1c4189c0c6de.js"></script></span></div>
<div><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif;">The flag is set as indestructible so that the players can't just attack the flag while it is on the base to take it. </span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif;">The attack mechanic in the game happens similarly. The magic wand has a RaycastOnActivateComponent used to determine whether a weapon for attacking other players is held or not. The players themselves have a FlagDropOnActivateComponent on them to detect when they are activated by another player holding a magic staff. If they are attacked, the game searches through the target player's inventory to see if they are holding a flag:</span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/fb5b7bb352e98dd99538a0f5a2e1a938.js"></script></span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">The code also adds a particle effect on the players when they pick up a flag that is removed when the player drops the flag. The particle effects are either red hearts or black spades depending on whether the player is holding a red or black flag. This indicator can be seen by allies and enemy team members so that players can see who is currently holding a flag. </span><br clear="none"/><div><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif;"><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/48c2ae3d-7e9b-4ec4-8c73-db8fb27aa5bc/82634b2c-e0d3-42cb-b270-5da752387ff8.jpg" /></span></div>
<div style="text-align: center;"><span style="font-family: verdana, helvetica, sans-serif;"><em>Player holding flag has particle effects placed on them</em></span><br clear="none"/></div></div><div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><em>Pull requests:</em> </span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Sets flags as indestructble: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/24" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/24</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adds team component to bases: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/25" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/25</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adds faction component to player, changes flag pickup logic, and starts player on platform: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/65" target="_blank">https://github.com/Terasology/LightAndShadow/pull/65</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adding flag prefab and code for activation: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/23" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/23</a></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adding magic staff item: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/26" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/26</a></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Player vs Player Combat Mechanics: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/68" target="_blank">https://github.com/Terasology/LightAndShadow/pull/68</a></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Improvements to Capture the Flag attack system: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/69" target="_blank">https://github.com/Terasology/LightAndShadow/pull/69</a> </span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adds particle effects and textures for when flag is held: https://github.com/Terasology/LightAndShadowResources/pull/29</span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><span style="font-size: 14px;"><br clear="none"/></span></strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><span style="font-size: 14px;">Scoring and UI: </span></strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">To complete the gameplay loop, I worked on allowing players to score and added UI to indicate the player's score. Scoring works similarly to the code for attacking another player--when the player presses the activate button on a base block (detected through a component on the block), the game searches through the player's inventory to see if they have a flag. If they do, the score of that team increases, and the block is removed from the player's inventory and placed back at its home base. This score is kept track of using integer fields in the ScoreSystem. </span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">To display the score to players, I created a HUD element where the values for the black score and red score are bound to the ScoreSystem's fields for the red and black scores. When a player scores, this sends an event to all clients that updates their HUD with the current score, so that score is properly synced and displayed across multiplayer: </span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/4825499dfe9b6c802f61b2e81d5138fe.js"></script></span><br clear="none"/></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><script src="https://gist.github.com/dacharya64/c19ce6f5ba313b5a8c3977bf064f52e9.js"></script></span></div>
<div><br clear="none"/></div><div style="text-align: center;"><span style="font-family: verdana, helvetica, sans-serif;">
</span><div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/48c2ae3d-7e9b-4ec4-8c73-db8fb27aa5bc/8d69e28e-0d1b-488d-a43d-d853b0d769c0.png" /></div><em>Left: A view from the black team's player running with the flag</em></div><div style="text-align: center;"><span style="font-family: verdana, helvetica, sans-serif;"><em>Right: A player watching the black team's player run towards the black team's base</em></span></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><em>Pull requests: </em></span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adding beginning elements of score system and UI: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/67" target="_blank">https://github.com/Terasology/LightAndShadow/pull/67</a></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adding custom font Wicked Queen: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/28" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/28</a></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Adding Client HUD and Score System: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/70" target="_blank">https://github.com/Terasology/LightAndShadow/pull/70</a> </span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;">Fix for flag stealing and scoring not working in headless server + client setup: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/71" target="_blank">https://github.com/Terasology/LightAndShadow/pull/71</a> </span><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><span style="font-size: 14px;"><br clear="none"/></span></strong></span></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><strong><span style="font-size: 14px;">Conclusion: <br clear="none"/></span></strong></span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;"><span style="font-size: 14px;">The work for Google Summer of Code provides a working Capture the Flag game mode with support for multiplayer gameplay that features team-based collaboration, flag stealing, and scoring. Some features from the initial proposal did not make it into this summer's GSoC work (ex. weapon cooldowns) and other features not initially part of the MVP did make it into the game (ex. player skinning). </span><br clear="none"/></span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;"><span style="font-size: 14px;"><br clear="none"/></span></span></div>
<div><span style="font-size: 18px; font-family: verdana, helvetica, sans-serif;"><span style="font-size: 14px;">I do have several recommendations for future work, both for the MVP and for larger improvements beyond, which I detail below. The game is available to test and play as well, with more information about how to do so at the end of this post. <br clear="none"/></span></span></div>
<div><br clear="none"/></div>
<div><span style="font-family: verdana, helvetica, sans-serif;"><br clear="none"/><br clear="none"/></span></div><p><span style="font-size: 13.5pt; font-family: verdana, helvetica, sans-serif; color: #000000;">Future Work: </span></p><p><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><strong><span style="color: #000000;">Partially Completed: </span></strong></span></p><p><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif; color: #000000;">Some improvements to gameplay are partially completed, but still have some work to be done. One improvement is changing the symbols on the health HUD based on the team the player is on. This lets the player know which team they are on, and adds some flavor to the game. The player should start off with white circles on their health HUD, which change to red hearts or black spades depending on the team selected.</span></p><p><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif; color: #000000;">I also started work on improving player skinning, which makes the player's avatar no longer visible to them, and does not leave the model in the world when the player disconnects from the server.</span></p><p><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif; color: #000000;">Both of these work on singleplayer but do not currently sync correctly in multiplayer, so need more work before being merged.</span></p><p><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><em><span style="color: #000000;">Pull requests:</span></em></span></p><p><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><span style="color: #000000;">[WIP] Update to how player skinning on team selection is handled: </span><span style="color: #000000;"></span><span style="color: #000000;"><a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/72" target="_blank">https://github.com/Terasology/LightAndShadow/pull/72</a> </span></span></p><p><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif; color: #000000;">[WIP] HUD now reskins with red hearts/black spades on team selection: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/73" target="_blank">https://github.com/Terasology/LightAndShadow/pull/73</a> </span></p><div><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><br clear="none"/></span></div><p><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><strong><span style="color: #000000;">Recommended Minimum Viable Product Improvements: </span></strong></span></p><p><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif; color: #000000;">There are several features that I'd recommend adding to the MVP. The first is handling level reset for when one team reaches the set number of points to win. There should be some indication that a team has won (ex. UI popup screen), and the level should be reset with the world being regenerated and players moved back to the spawn platform.</span></p><p><span style="font-size: 14px; font-family: verdana, helvetica, sans-serif; color: #000000;">There should also be improved terrain features, such as a maze, added to the world to create more variety and challenge in the Capture the Flag game mode. This would add more replayability to the game as well.</span></p><p><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><strong><span style="color: #000000;">Possible future directions: </span></strong></span></p><p><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;"><span style="color: #000000;">There are many possible long-term improvements to the game, including changing the way the start of the game is handled (team selection and round start), providing more player skins, and adding more weapons and abilities for players. They are listed in more detail in the Outbox section of the project board:</span><a shape="rect" href="https://github.com/orgs/Terasology/projects/11" target="_blank"> <span style="color: #0000ff;">https://github.com/orgs/Terasology/projects/11</span></a></span></p><div><span style="font-family: verdana, helvetica, sans-serif;"><br clear="none"/><br clear="none"/></span></div><p><span style="font-size: 13.5pt; font-family: verdana, helvetica, sans-serif; color: #000000;">Testing and Playing:</span></p><p><span style="font-family: verdana, helvetica, sans-serif;"><span style="font-size: 10.5pt; color: #000000;">The game mode is available to play. Download</span><a shape="rect" href="https://github.com/MovingBlocks/Terasology/" target="_blank"> <span style="font-size: 10.5pt; color: #0000ff;">Terasology</span></a><span style="font-size: 10.5pt; color: #000000;">, fetch the</span><a shape="rect" href="https://github.com/MovingBlocks/Terasology/wiki/Developing-Modules" target="_blank"> <span style="font-size: 10.5pt; color: #0000ff;">Light and Shadow module</span></a><span style="font-size: 10.5pt; color: #000000;">, and run the game in singleplayer or multiplayer, selecting the Light & Shadow gameplay template and the Light and Shadow (Simple) world generator.</span></span></p><div><span style="font-family: verdana, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><br clear="none"/></div>
GSoC Week 11: Nearing the Endhttps://dacharya64.postach.io/post/gsoc-week-11-nearing-the-end2018-08-10T19:15:51.825000Z2018-08-02T13:52:58ZDevi Acharya<div>It's hard to believe that Google Summer of Code is almost over!</div>
<div><br clear="none"/></div>
<div>This week I focused mainly on getting the particle effects for when the player is holding the flag working across multiplayer, so that the host and any joined clients were in sync. One of the problems with the code is that the adding and removing of the particle effects happened in a lot of different places--when the player was attacked, when the player pressed `E` to pick up a flag, etc. I got rid of this redundancy by just having the server send out an event to all clients when the flag was added or removed from the player's inventory. Because the call was made multiple times, I had to check whether or not the player already had a FlagParticleComponent on them before adding it, otherwise an incorrect number of particle entities would spawn in the world. </div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">// In ClientParticleSystem, an example of handling flag pickup through events</span></div>
<div><span style="font-family: 'courier new', courier, monospace;">// Much of the creating a child particle component comes from here: https://gist.github.com/jellysnake/2a18b1670fe26b59cbdae7c686356cde</span></div>
<div><pre xml:space="preserve"><span>@ReceiveEvent<br clear="none"/></span><span>public void </span><span>onFlagPickup</span>(FlagPickupEvent event<span>, </span>EntityRef entity) {<br clear="none"/> String team = event.<span>team</span><span>;<br clear="none"/></span><span> </span>EntityRef player = event.<span>player</span><span>;<br clear="none"/></span><span><br clear="none"/></span><span> if </span>(!player.hasComponent(FlagParticleComponent.<span>class</span>)) {<br clear="none"/> EntityRef particleEntity = <span>entityManager</span>.create(LASUtils.<span>getFlagParticle</span>(team))<span>;<br clear="none"/></span><span> </span>FlagParticleComponent particleComponent = <span>new </span>FlagParticleComponent(particleEntity)<span>;<br clear="none"/></span><span><br clear="none"/></span><span> </span>LocationComponent targetLoc = player.getComponent(LocationComponent.<span>class</span>)<span>;<br clear="none"/></span><span> </span>LocationComponent childLoc = particleEntity.getComponent(LocationComponent.<span>class</span>)<span>;<br clear="none"/></span><span> </span>childLoc.setWorldPosition(targetLoc.getWorldPosition())<span>;<br clear="none"/></span><span> </span>Location.<span>attachChild</span>(player<span>, </span>particleEntity)<span>;<br clear="none"/></span><span> </span>particleEntity.setOwner(player)<span>;<br clear="none"/></span><span> </span>player.addOrSaveComponent(particleComponent)<span>;<br clear="none"/></span><span> </span>}<br clear="none"/> <span>if </span>(!player.hasComponent(HasFlagComponent.<span>class</span>)) {<br clear="none"/> player.addComponent(<span>new </span>HasFlagComponent(team))<span>;<br clear="none"/></span><span> </span>}<br clear="none"/>}</pre><br clear="none"/></div>
<div>I also worked on some smaller improvements to gameplay, such as changing the texture on the bases to red and black respectively, and changing the flag drop on player attack to land closer to the midpoint between the attacker and the target, so it's easier for either party to take the flag. </div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/755178eb-70a2-43bc-b77f-5a3ab9af8a55/cc54196c-1a55-4ca5-a0cd-f13a8a78847e.png" /></div>
<div><br clear="none"/></div>
<div style="text-align: center;"><em>Different bases for different teams</em><br clear="none"/></div>
<div style="text-align: center;"><em><br clear="none"/></em></div>
<div style="text-align: left;">There's still a number of things I want to get done before the big playtest and code wrap up: </div>
<div style="text-align: left;">+ Properly handling player skinning, with player skins appearing correctly rotated and player cube removed</div>
<div style="text-align: left;">+ Handling one team winning (reaching max score) -- there's a lot that needs to go into a level reset, but I at least want to add something to indicate this, such as some UI text popping up to show which team won</div>
<div style="text-align: left;">+ UI indication of which team a player is on when they choose a team</div>
<div style="text-align: left;">+ Ideally, still putting in a maze to make the CTF gameplay more challenging </div>
<div style="text-align: left;"><br clear="none"/></div>
<div style="text-align: left;">So I'll be trying to get everything good and ready for the end of GSoC!</div>
<div style="text-align: left;"><br clear="none"/></div>
<div style="text-align: left;"><p>PRs for this week:</p><p>Adding Client HUD and Score System: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/70" rel="nofollow noopener" target="_blank">https://github.com/Terasology/LightAndShadow/pull/70</a></p><p>Changes base blocks to be red/black depending on base instead of gray stone: https://github.com/Terasology/LightAndShadowResources/issues/30</p><br clear="none"/></div>
<div style="text-align: left;"><br clear="none"/></div>
GSoC Week 10: Multiplayer and Character Skinninghttps://dacharya64.postach.io/post/gsoc-week-10-multiplayer-and-character-skinning2018-07-25T23:56:19.253000Z2018-07-19T16:18:50ZDevi Acharya<div><div>It's in the last couple of weeks for Google Summer of Code!</div>
<div><br clear="none"/></div>
<div>This week I worked on improvements for adding and removing particles, and character skinning for players. </div>
<div><br clear="none"/></div>
<div>For the particle system, I now handle cases where the player drops the flag through placing it into the world, by checking for it in the <span style="font-family: 'courier new', courier, monospace;">onInventorySlotChanged</span> event: </div>
<div><br clear="none"/></div>
<div><pre xml:space="preserve"><span>// Checks if player puts down flag<br clear="none"/></span><span>item </span>= event.getOldItem();<br clear="none"/><span>if </span>(itemIsFlag(<span>item</span>)) {<br clear="none"/> removeParticleEmitterFromPlayer(player);<br clear="none"/> player.removeComponent(HasFlagComponent.<span>class</span>);<br clear="none"/>}</pre><br clear="none"/></div>
<div>I also worked on getting the particle emitters working correctly both in single player and multiplayer instances. I decided to go with the method of creating an entity based on a particle prefab so I could keep the multiple components needed to generate the particle effect I wanted, so whenever the player obtains a flag a particle effect entity is also created, and is removed from the player when the flag is put down. I got some good advice (https://gist.github.com/jellysnake/2a18b1670fe26b59cbdae7c686356cde) about how to better handle how particle effects are added and removed from the player through changing the LocationComponent, and will look into it this week. </div>
<div><br clear="none"/></div>
<div>I also worked on character skinning this week, adding an entity to the world that matched the <span style="font-family: 'courier new', courier, monospace;">LocationComponent</span> of the player so that it would move and rotate along with the player, using the <span style="font-family: 'courier new', courier, monospace;">RedPawn</span> and <span style="font-family: 'courier new', courier, monospace;">BlackPawn</span> models on teleport depending on which team the player chooses. Right now the player's default cube body is also displayed alongside it, so I need to look into how to best deal with that, for instance if I can safely remove the instance of this entity without accidentally removing components that are important for the player.</div>
<div><br clear="none"/></div><br clear="none"/></div><div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/23716c03-38ec-4afe-bc42-71e580bfa139/9cb4550e-703a-4c22-9097-30d79642f76a.jpg" /></div>
<div style="text-align: center;"><em>A player approaches!</em><br clear="none"/></div>
<div><div><br clear="none"/></div>
<div>A couple of outstanding multiplayer issues: </div>
<div>+ Particles are added, but not removed properly in client/multiplayer session (works on server/host, but not client) </div>
<div>+ There are still issues with certain things not rendering in multiplayer, such as the player model for the black pawn character. I'm not sure why that is, but going to dig around more to see what it could be. </div>
<div><br clear="none"/></div>
<div>The big additional features I definitely want done before the end of GSoC are adding in an environment (one great suggestion was a maze) to make the Capture the Flag gameplay more challenging, and handling the overall game reset after one team reaches their goal number of points. So it'll be a race to the finish to get everything in, make fixes, test, and continue to assess what I can get done in the time remaining. </div>
<div><br clear="none"/></div>
<div>PRs for this week:</div>
<div>Adding Client HUD and Score System: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/70" target="_blank">https://github.com/Terasology/LightAndShadow/pull/70</a></div>
<div>Adds particle effects and textures for when flag is held: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/29" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/29</a></div><br clear="none"/></div>GSoC Week 9: Flag Particles and Synced Scoringhttps://dacharya64.postach.io/post/gsoc-week-9-flag-particles-and-synced-scoring2018-07-19T00:14:08.907000Z2018-07-18T23:49:06ZDevi Acharya<div>It's 9 weeks into Google Summer of Code and things are progressing!</div>
<div><br clear="none"/></div>
<div>This week I worked on some different additions to the Capture the Flag gameplay. First off, I fixed the problem I was having last week with held items not having the right components for checks--specifically, not being able to search for if a flag has a <span style="font-family: 'courier new', courier, monospace;">BlackFlagComponent</span>, for instance, if I am trying to see if it is a black flag. I found out that adding<pre xml:space="preserve"><span>@AddToBlockBasedItem</span></pre>to a given component would allow that component to be detected, even if being held. </div>
<div><br clear="none"/></div>
<div>Secondly, I worked on adding the Score HUD to the client when there is a game being hosted on the server and a client joins in. Now the server updates the server's score, then sends an event to all clients to update their HUD's score to what the server's scores are. The client HUD itself is created and bound in a separate system, ClientScoreSystem.java, which has<pre xml:space="preserve"><span>@RegisterSystem</span>(RegisterMode.<span>CLIENT</span>)</pre>and thus displays in multiplayer.</div>
<div><br clear="none"/></div>
<div>Thirdly, I worked on adding a particle emitter to the player when they're holding a flag. I created new particle sprites to fit in with the theme of Light and Shadow (using red hearts and black spades) and have the builder build a new prefab (ex. <span style="font-family: 'courier new', courier, monospace;">BlackFlagParticleEffect.prefab</span>) with the LocationComponent of the player so the emitter moves when the player moves. I have discovered that this might be too complicated a way to handle this, so I want to look into just adding a <span style="font-family: 'courier new', courier, monospace;">ParticleEmitterComponent</span> to the player instead. </div>
<div><br clear="none"/></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/bde422b7-8e42-4062-9917-cf6a1398aa95/9764cd96-6c71-4de9-8c8b-1d5c6a9386e4.jpg" /></div>
<div style="text-align: center;"><em>Heart particles streaming out behind player</em><br clear="none"/></div>
<div><br clear="none"/></div>
<div><div>Finally, I worked on (and am continuing to work on) handling all cases of the flag being taken and dropped, making sure I properly handle adding and removing the flags at the proper time. For instance, now the flags should be removed from any players holding flags when a player scores. But right now the case where the player places the flag in the world is not handled. This might be used by players to transfer the flag to other players, for instance. </div>
<div><br clear="none"/></div>
<div>In the meeting last week we talked about some other possible ways to go once these things are taken care of. Some possibilities: character skinning for red/black teams, creating a maze or other environmental factors to make the Capture the Flag gameplay more fun, or attractor/repulsor rays for players. Once I sort out some of these issues I think character skinning is next, as this will help add more visual interest and help players distinguish teammates from enemies. </div>
<div><br clear="none"/></div>
<div>PRs for this week: </div>
<div>Adding Client HUD and Score System: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/70">https://github.com/Terasology/LightAndShadow/pull/70</a></div>
<div>Adds particle effects and textures for when flag is held: <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/29">https://github.com/Terasology/LightAndShadowResources/pull/29</a><br clear="none"/></div>
<div><br clear="none"/></div><br clear="none"/></div>GSoC Week 8: Scoring Goals and Second Evalshttps://dacharya64.postach.io/post/gsoc-week-8-scoring-goals-and-second-evals2018-08-11T15:52:14.213000Z2018-07-12T03:40:00ZDevi Acharya<div>Another week has passed for Google Summer of Code, and more work has progressed!</div>
<div><br clear="none"/></div>
<div>This week I've largely been working on changes to last week's code based on suggestions for refactoring, and adding in components to help with various checks and code clarity. I've gone through much of the code for the <span style="font-family: 'courier new', courier, monospace;">AttackSystem</span> and <span style="font-family: 'courier new', courier, monospace;">ScoreSystem</span> to make it more understandable, and to add some needed null hardening. </div>
<div><br clear="none"/></div>
<div>One of the biggest stumbling blocks for this week, though, has been an issue of detecting components of elements that are being picked up by the player, namely the flag being carried not being able to be detected through checks for having a BlackFlagComponent or RedFlagComponent. This I've been told could be solved using the <span style="font-family: 'courier new', courier, monospace;">AddToBlockBasedItem <span style="font-family: gotham, helvetica, sans-serif;">annotation, and this is something I'm hoping to test out as soon as possible. </span></span></div>
<div><br clear="none"/></div>
<div>I also worked on some other features that are important for the gameplay as a whole: </div>
<div>-The player can now tag their home base even if they are not holding the flag to score a point for their team</div>
<div>-The game now takes into account when a team reaches a set number of points (the goal score), and has logic to handle this (for instance, resetting the game objects and score and teleporting players back to the platform). </div>
<div>-Changing the UI of the black score to black instead of gray</div>
<div><br clear="none"/></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/24cbf0d2-ea80-448f-bd75-a85b829e00bd/6ebf8e06-f837-4470-b13f-292821e5d45f.jpg" /><br clear="none"/></div>
<div style="text-align: center;"><em>Red has scored!</em></div>
<div><br clear="none"/></div>
<div>Hoping to figure out these issues with the flag components quickly, then move on to other features, such as adding a particle effect to the player holding the flag, and adding a timer to rounds. </div>
<div><br clear="none"/></div>
<div><div><br clear="none"/></div>
<div>PRs for this week:</div>
<div>LAS: https://github.com/Terasology/LightAndShadow/pull/69<br clear="none"/></div>
<div>LASR: https://github.com/Terasology/LightAndShadowResources/pull/28</div></div><div><br clear="none"/></div>
GSoC Week 7: Completing the Gameplay Loophttps://dacharya64.postach.io/post/gsoc-week-7-completing-the-gameplay-loop2018-08-11T15:52:20.209000Z2018-07-04T19:58:31ZDevi Acharya<div>So far I've been working on getting the bare bones working for the main Capture the Flag gameplay. This week I worked on more improvements to this, to get the game into a more playable state. </div>
<div><br clear="none"/></div>
<div>Firstly, I focused to improvements for having players drop and pick up the flag. Before, when a player tagged another, the other player would only drop the flag they had if it was being held. I instead search through the player's inventory to see if there is a flag in there, and if so, it is dropped. </div>
<div><br clear="none"/></div>
<div>I did this by creating a loop that searched the player's inventory for the appropriate item: </div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">// AttackSystem.java</span></div>
<div><pre xml:space="preserve"><span>int </span>inventorySize = <span>inventoryManager</span>.getNumSlots(entity)<span>;<br clear="none"/></span><span>for </span>(<span>int </span>slotNumber = <span>0</span><span>; </span>slotNumber <= inventorySize<span>; </span>slotNumber++) {<br clear="none"/> EntityRef inventorySlot = <span>inventoryManager</span>.getItemInSlot(entity<span>, </span>slotNumber)<span>;<br clear="none"/></span><span> if </span>(inventorySlot.hasComponent(BlockItemComponent.<span>class</span>)) {<br clear="none"/> <span>if </span>(inventorySlot.getComponent(BlockItemComponent.<span>class</span>).<span>blockFamily</span>.getURI().toString().equals(flagTeam)) {<br clear="none"/> <span>return </span>inventorySlot<span>;<br clear="none"/></span><span> </span>}<br clear="none"/> }<br clear="none"/>}<br clear="none"/><span>return </span>EntityRef.<span>NULL</span><span>;</span></pre><br clear="none"/></div>
<div>And then taking the appropriate action, for instance if an inventorySlot with a red flag is found: </div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">// AttackSystem.java</span><br clear="none"/></div>
<div><pre xml:space="preserve"><span>if </span>(<span>redFlagSlot </span>!= EntityRef.<span>NULL</span>) {<br clear="none"/> Vector3f position = <span>new </span>Vector3f(entity.getComponent(LocationComponent.<span>class</span>).getLocalPosition())<span>;<br clear="none"/></span><span> </span>Vector3f impulseVector = <span>new </span>Vector3f(attackingPlayer.getComponent(LocationComponent.<span>class</span>).getLocalPosition())<span>;<br clear="none"/></span><span> </span>entity.send(<span>new </span>DropItemRequest(<span>redFlagSlot</span><span>, </span>entity<span>, </span>impulseVector<span>, </span>position))<span>;<br clear="none"/></span><span> return;<br clear="none"/></span>}</pre><br clear="none"/></div>
<div>I also added code to make the flag teleport back to the base on score increase:</div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">// ScoreSystem.java</span></div>
<div><span style="font-family: 'courier new', courier, monospace;">// On Black team scoring, return captured red flag to base</span></div>
<div><pre xml:space="preserve"><span>inventoryManager</span>.removeItem(player<span>, </span>player<span>, </span>heldItem<span>, true</span>)<span>;<br clear="none"/></span><span>worldProvider</span>.setBlock(<span>new </span>Vector3i(LASUtils.<span>CENTER_RED_BASE_POSITION</span>.<span>x</span><span>, </span>LASUtils.<span>CENTER_RED_BASE_POSITION</span>.<span>y </span>+ <span>1</span><span>, </span>LASUtils.<span>CENTER_RED_BASE_POSITION</span>.<span>z</span>)<span>, </span><span>blockManager</span>.getBlock(LASUtils.<span>RED_FLAG_URI</span>))<span>;</span></pre></div>
<div><br clear="none"/></div>
<div style="text-align: center;"><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/68805b31-aeba-442c-9bb9-9920f384a023/59dbb6f4-651d-432f-98f7-b531492e976e.jpg" /></div>
<div style="text-align: center;"><em>Two players face off</em></div>
<div><br clear="none"/></div>
<div>Finally I worked on reskinning the UI to make it look better and fit into the game mode for Light And Shadow. I used the same font used for some of the Light And Shadow material, and used dark gray and red colors for parts of the score UI. <br clear="none"/></div>
<div><br clear="none"/></div>
<div>I created a new .skin file for the UI, and reskinned it like so: </div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/68805b31-aeba-442c-9bb9-9920f384a023/3b6ea4d0-3c48-4577-82eb-face2da2e42f.jpg" /></div>
<div>Also want to give a special thanks for the folks at Terasology for taking the module out for a test drive, doing some great multiplayer gaming and taking notes of things that needed changes.</div>
<div><br clear="none"/></div>
<div>So far so good! With the changes from this week, the Capture the Flag game mode is now far more playable and fun. </div>
<div><br clear="none"/></div>
<div>There are still some bugs that need to be worked out, mainly issues with things not being consistent across multiplayer like the score UI and Magic Fool NPC. </div>
<div><br clear="none"/></div>
<div>I also want to get started on some of the final things that will make the game mode complete, the big things being adding a particle effect to players carrying the flag, and handling the end of the game, after multiple rounds are won--resetting the world. </div>
<div><br clear="none"/></div>
<div>So far, I feel I've been making good headway, and things are really coming along now. Looking forward to seeing this come together even more.</div>
<div><br clear="none"/></div>
<div>PRs for this week: </div>
<div>LAS: https://github.com/Terasology/LightAndShadow/pull/69<br clear="none"/></div>
<div>LASR: https://github.com/Terasology/LightAndShadowResources/pull/28</div>
GSoC Week 6: Making PvP Magichttps://dacharya64.postach.io/post/gsoc-week-6-making-pvp-magic2018-08-11T15:52:27.718000Z2018-06-28T03:42:35ZDevi Acharya<div>This week I've been focusing on some of the fundamental code for the Capture the Flag game mode--getting combat mechanics working between players. It's important for players to be able to interact with one another, and this code (and the mechanics they entail) will be important to how people play and enjoy the game. <br clear="none"/></div>
<div><br clear="none"/></div>
<div>The main idea behind the PvP is that players can use a weapon to tag other players, causing them to drop their flag if it is being held. </div>
<div><br clear="none"/></div>
<div>To begin, I created a new weapon for the player to use, the magic staff. </div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/cc23fc2f-69ac-45e8-8e2e-a02088a32394/02747b7e-c8fe-4bd5-8cde-15f9acf7eba0.png" /><br clear="none"/></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/cc23fc2f-69ac-45e8-8e2e-a02088a32394/dc2dcab8-49e3-40b9-ae88-8388b73523c1.jpg" /></div>
<div style="text-align: center;"><em>Magic Staff texture vs in game</em><br clear="none"/></div>
<div><br clear="none"/></div>
<div>I set the magic staff to be given to the player when they teleport to their base by adding this line to the <span style="font-family: "courier new", courier, monospace;">TeleporterSystem</span>: </div>
<div><br clear="none"/></div>
<div><pre>inventoryManager.giveItem(player<span>, </span>EntityRef.NULL<span>, </span>entityManager.create(<span>"LightAndShadowResources:magicStaff"</span>))<span>;</span></pre><br clear="none"/></div>
<div> since that is where they have chosen one of the warring factions and will be fighting with the other. </div>
<div><br clear="none"/></div>
<div>I then started in on the code that would let players interact with one another and potentially steal the flag from one another. What confused me in thinking about the system was that in some of the other <span style="font-family: "courier new", courier, monospace;">onActivate</span> code that I've written, the component for triggering the event is on the item the player is targeting when pressing Activate, rather than dependent on the object being held. </div>
<div><br clear="none"/></div>
<div>To that end, I altered the delta of the <span style="font-family: "courier new", courier, monospace;">Player.prefab</span> to have a component to look for on activate (<span style="font-family: "courier new", courier, monospace;">"FlagDropOnActivate" : {}</span>). </div>
<div><br clear="none"/></div>
<div>The AttackSystem works in the following way: </div>
<div><br clear="none"/></div>
<div>-Checks to see if the attacking player is holding a magic staff (or potentially any other item with the given component attached</div>
<div><pre><span>if </span>(attackingPlayer.getComponent(CharacterHeldItemComponent.<span>class</span>).<span>selectedItem</span>.hasComponent(RaycastOnActivateComponent.<span>class</span>)) {</pre></div>
<div><br clear="none"/></div>
<div>-Checks to see if the thing being targeted on activate is a player with an inventory (should always be true for now)</div>
<div><pre><span>if </span>(entity.hasComponent(PlayerCharacterComponent.<span>class</span>) && entity.hasComponent(CharacterHeldItemComponent.<span>class</span>)) {</pre><br clear="none"/></div>
<div>-Checks to see if the player being attacked is holding a red or black flag</div>
<div><pre><span>if </span>(heldItem.getComponent(BlockItemComponent.<span>class</span>).<span>blockFamily</span>.getURI().toString().equals(<span>BLACK_FLAG_URI</span>)<br clear="none"/> || heldItem.getComponent(BlockItemComponent.<span>class</span>).<span>blockFamily</span>.getURI().toString().equals(<span>RED_FLAG_URI</span>)) {</pre><br clear="none"/></div>
<div>-If so, make the attacked player drop the flag</div>
<div><pre>entity.send(<span>new </span>DropItemRequest(heldItem<span>, </span>entity<span>, </span>impulseVector<span>, </span>newPosition))<span>;</span></pre><br clear="none"/></div>
<div>So far, this works as intended--if the player is targeted by someone with the magic staff and the attackers activates the staff, the player holding the flag will drop it. It can then be picked up by either party. So it's a success!</div>
<div><br clear="none"/></div>
<div>However, there are still certain things that to be fixed up: </div>
<div>- Right now the player has to be holding the flag to be able to drop it, rather than just having it in their inventory. The way I was envisioning it, the player cannot use the magic staff while holding the flag (adding slightly more difficulty to being the flag bearer) but this can be changed to see if the person is holding a flag in general</div>
<div>- I need to fix the issue of players being able to pick up their own team's flag when it's in the world (my current plan is to have the flag sent back to spawn point/base on pickup)</div>
<div>-There is also the question of friendly fire--should a player be able to target a flagbearer from their own team and cause the flag to drop? </div>
<div>- cervator mentioned there were some issues with teleporting using the red teleporter, which seems to work locally but I should investigate this further</div>
<div>- cervator also stated that the scores right now are not synchronized in a connected client server, which I need to test and get working. cerv said: </div>
<div style="padding-left: 30px;">score shows up OK looking if i'm on a server/client, but not on a connected normal client. Probably something authority system vs client system or replication stuffs <br clear="none"/>yep looks like `ScoreSystem` is Authority only, yet it directly maps to UI stuff. So that in theory would only happen if you're running a server/client<br clear="none"/>i want to say the ping system might be a good example of a logic system that runs on the authority, yet displays UI updates on all clients<br clear="none"/>and i know it works and was recently improved some in https://github.com/MovingBlocks/Terasology/pull/3329 (which i fixed further with part of #3379)<br clear="none"/>involves `ServerPingSystem`, `ClientPingSystem`, `OnlinePlayersOverlay` and some other stuff<br clear="none"/></div>
<div>- There are a couple places where Strings can be replaced by constants, for consistency's sake</div>
<div>- More multiplayer testing</div>
<div><br clear="none"/></div>
<div>PRs for this week: </div>
<div>Player vs Player Combat Mechanics: https://github.com/Terasology/LightAndShadow/pull/68<br clear="none"/></div>
<div>Adding magic staff item: https://github.com/Terasology/LightAndShadowResources/pull/26<br clear="none"/></div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
GSoC Week 5: Keeping Scorehttps://dacharya64.postach.io/post/gsoc-week-5-keeping-score2018-08-11T15:52:30.456000Z2018-06-21T02:31:47ZDevi Acharya<div>After trials and tribulations this week, I've gotten the score system working! I had started some of the base code for the score system last week, but didn't realize how much more time it would take to puzzle the whole thing out. I changes up the base rasterizer and prefabs so that each of the base blocks have a team faction attached to them. I also added a component to them that allows them to be activated, and so that when they are activated they trigger a check to see if the activator (player) has the enemy flag--if so, it adds a point to the player's team. </div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">// Checking to see if the player is activating their base and have the enemy flag </span></div>
<div><pre xml:space="preserve"><span>if </span>(baseTeamComponent.<span>team</span>.equals(baseTeamComponent.<span>BLACK</span>) && heldItem.getComponent(BlockItemComponent.<span>class</span>).<span>blockFamily</span>.getURI().toString()<br clear="none"/> .equalsIgnoreCase(<span>"LightAndShadowResources:RedFlag"</span>)) {<br clear="none"/> <span>blackScore</span>++<span>;<br clear="none"/></span>}</pre></div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">ScoreSystem.java</span> handles the bulk of the lifting going on. It handles the <span style="font-family: 'courier new', courier, monospace;">onActivate</span> code previously mentioned, as well as the bindings for the UI. The UI has UILabels for each team's score, and binds the redScore and the blackScore values to integers in <span style="font-family: 'courier new', courier, monospace;">ScoreSystem.java</span>. </div>
<div><br clear="none"/></div>
<div><span style="font-family: 'courier new', courier, monospace;">// An example of score binding to a particular section of the UI </span></div>
<div><pre xml:space="preserve"><span>scoreScreen </span>= <span>nuiManager</span>.getHUD().getHUDElement(<span>"LightAndShadow:ScoreHud"</span>)<span>;<br clear="none"/></span><span>blackScoreArea </span>= <span>scoreScreen</span>.find(<span>"blackScoreArea"</span><span>, </span>UILabel.<span>class</span>)<span>;<br clear="none"/></span><span>blackScoreArea</span>.bindText(<span>new </span>ReadOnlyBinding<String>() {<br clear="none"/> <span>@Override<br clear="none"/></span><span> </span><span>public </span>String <span>get</span>() {<br clear="none"/> <span>return </span>String.<span>valueOf</span>(<span>blackScore</span>)<span>;<br clear="none"/></span><span> </span>}<br clear="none"/>})<span>;</span></pre><br clear="none"/></div>
<div>So in short--the new score system keeps track of two integers, <span style="font-family: 'courier new', courier, monospace;">redScore</span> and <span style="font-family: 'courier new', courier, monospace;">blackScore</span>, binds those values to the HUD UI, and then adds to the current score when the player activates a block at their base and holds the enemy flag.</div>
<div><br clear="none"/></div>
<div><div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/cddae422-3d3b-4f99-92df-502e81f0a296/6dc5c3bd-d2a1-4464-986d-9fe4a12fe400.jpg" /></div>
<div style="text-align: center;"><em>Black team scores!</em></div><br clear="none"/></div><div><br clear="none"/></div>
<div>The one big thing missing from the main gameplay loop is the resetting of the level when a player scores. </div>
<div><br clear="none"/></div>
<div>I was hoping to start on some of the weapons and raycasting code this week, but unfortunately wasn't able to yet. I'm hoping to talk more about the best way to implement some of this at the meeting tomorrow (already heard that the Gookeeper code was one place to look for this) and make any revisions to the current PR as needed. I've been thinking maybe an item similar to the current magic wand is the way to go for the item (magic staff, maybe?) to allow the players to target one another. </div>
<div><br clear="none"/></div>
<div>Work up to this date are in the same PR as last week, <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/67" target="_blank">https://github.com/Terasology/LightAndShadow/pull/67</a></div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
GSoC Week 4: Merges, Scores, and First Evaluation!https://dacharya64.postach.io/post/gsoc-week-4-merges-scores-and-first-evaluation2018-08-11T15:52:38.233000Z2018-06-14T02:23:38ZDevi Acharya<div>This week was the first evaluation for Google Summer of Code! The process so far has definitely been one of learning, but it's also had some hiccups and frustrations along the way. It's been nice to be able to look back and see all of what has been done so far, and what's ahead of me. </div>
<div><br clear="none"/></div>
<div>This week I started working on the code for scoring, but it ended up being a bit more complicated than I initially thought. I set up a UI element for displaying the score, and have this text updated at the beginning of the game to display both the red and black team scores starting at 0. </div>
<div><br clear="none"/></div>
<div><pre xml:space="preserve"><span>scoreArea </span>= find(<span>"scoreArea"</span><span>, </span>UIText.<span>class</span>)<span>;<br clear="none"/></span>String scoreText = <span>"Red Team: " </span>+ <span>redScore </span>+ <span>" " </span>+<br clear="none"/> <span>"Black Team: " </span>+ <span>blackScore</span><span>;<br clear="none"/></span><span>scoreArea</span>.setText(String.<span>format</span>(scoreText))<span>;</span></pre><br clear="none"/></div>
<div>I also set up changes in Light and Shadow and Light and Shadow Resources so that the bases that are generated place stones of a certain team affiliation, so that I can check if the player is on a base that belongs to their own team.</div>
<div><br clear="none"/></div>
<div>But now I've got a ScoreSystem that has the logic for when a player scores and checking if they have the enemy flag, then awarding a point, as well as a UI to display the player's score, but I'm still struggling a bit to get them to communicate with one another so that I can create and update a global score, and have it sync across multiplayer. I thought maybe setting up score as a component would make it easier to access and use those variables but I'm still a bit confused as to how to structure the UI / entity / system / component elements of the equation, and what exactly the entity for the score would look like. </div>
<div><br clear="none"/></div>
<div>On the plus side, my PRs for last week have been merged after I fixed some styling mistakes, and the <span style="font-family: 'courier new', courier, monospace;">develop</span> and <span style="font-family: 'courier new', courier, monospace;">master</span> branches in LightAndShadow have been merged, making development now off of the <span style="font-family: 'courier new', courier, monospace;">master</span> branch and thankfully with everything seemingly in working order. </div><div>
<div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/930d0484-3fe4-4c05-8792-2d6349bea65c/0a183108-b348-4aee-aacc-209681cbcf0e.jpg" /></div>
<div style="text-align: center;"><em>Scoreboard is in place</em></div></div><div><br clear="none"/></div>
<div>I'm hoping that tomorrow's meeting will help me to better clarify how to finish up this scoring code effectively, and that I can start strongly into next week with some of the beginning code for guns and raycasting. Last week has also taught me to push code early and often, so I'm going to try to get more frequent iterations and PRs set up in the future. </div>
<div><br clear="none"/></div>
<div>This week's PRs: </div>
<div>LAS Score system and UI: <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/67">https://github.com/Terasology/LightAndShadow/pull/67</a></div>
<div>LASR Base elements: https://github.com/Terasology/LightAndShadow/pull/67</div>
<div><br clear="none"/></div>
<div style="text-align: center;"><em></em></div>
GSoC Week 3: Choosing Sideshttps://dacharya64.postach.io/post/gsoc-week-3-choosing-sides-22018-06-07T03:18:46.131000Z2018-06-07T02:29:11ZDevi Acharya<div>Week 3 of Google Summer of Code is done! This week I focused on continuing the faction code, making it so that players could choose their team (red or black) at the start of the game and, upon selection, get teleported to their team's base. <br clear="none"/></div>
<div><br clear="none"/></div>
<div>I'd already started some of the faction code last week, though due to the fact that I had some odd issues with my workspace I wasn't able to get this fully completed and tested. Once I started trying to work out my new code, I realized things weren't going to be as straightforward as I thought they'd be. </div>
<div><br clear="none"/></div>
<div>First off, I was having some issues with the Dialog module in terms of pressing dialog buttons to cause certain actions to fire. There were some issues figuring out how to fire multiple actions in dialog, with the dialog buttons not causing the desired action and leaving me unsure of why--if it had to do with the action not being fired by the dialog button, or something else along the line that wasn't working. </div>
<div><br clear="none"/></div>
<div>I decided to switch over to having a system of teleporters instead, a red and black one placed on the platform which the player could activate to join that team and teleport to that team's base (<a shape="rect" href="https://forum.terasology.org/threads/request-for-module-teleporters.1392/" target="_blank">based on this forum post</a>). I added teleporters to the rasterization of the floating platform, and changed up the NPC's dialog to reflect this (instructing the player to activate the appropriate teleporter to start). </div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div style="text-align: center;"><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/8297f8b7-7211-43b8-b350-5344433437ab/2d6e3d2d-d340-4345-ad0d-49576540d7a1.jpg" /><br clear="none"/></div>
<div style="text-align: center;"><em>Pick your side!</em><br clear="none"/></div>
<div style="text-align: center;"><br clear="none"/></div>
<div style="text-align: left;">The teleporter system was giving me some trouble at first--it appeared to not be firing on activate in the same way as the dialog system was acting up! I realized, though, that I was missing a <span style="font-family: 'courier new', courier, monospace;">@RegisterSystem(RegisterMode.AUTHORITY)<span style="font-family: gotham, helvetica, sans-serif;">at the beginning of the TeleporterSystem class, which cleared that problem up.</span></span></div>
<div style="text-align: left;"><span style="font-family: 'courier new', courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></span></div>
<div style="text-align: left;"><span style="font-family: 'courier new', courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;">The teleporter system works when a teleporter is activated, the system takes the player (<span style="font-family: 'courier new', courier, monospace;">EntityRef player = event.getInstigator();</span>) and sets their LASTeam component to the same as the teleporter they are activating. It then sends a teleport event causing the player to teleport to their team's base (right now these are hardcoded coordinates close to the flag). They can pick up the enemy's flag, but not their own.</span></span></div>
<div style="text-align: left;"><span style="font-family: 'courier new', courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></span></div>
<div style="text-align: left;"><span style="font-family: 'courier new', courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;">Another interesting thing I learned along the way was regarding testing--I'd built a UI structure to check the player's team, but thanks to a tip I learned I can just use <span style="font-family: 'courier new', courier, monospace;">dumpEntities</span> in the console to check the team component of the player.</span></span></div>
<div style="text-align: left;"><span style="font-family: 'courier new', courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></span></div>
<div style="text-align: left;"><span style="font-family: 'courier new', courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;">I was hoping to get the win detection and scoring UI set up this week, and while I've started on some of that code it's not ready yet. I'm hoping next meeting to solidify the best way to determine win condition (entering a region? collision with friendly base?) and to start testing out how to access what's in a player's inventory. The main game loop is almost there, and soon to come will be guns--which I think will be the most difficult of what I've tackled so far, but also super rewarding once it comes together. </span></span></div>
<div><br clear="none"/></div>
<div><p>Pull Requests for this week: </p><p><a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/65" target="_blank">https://github.com/Terasology/LightAndShadow/pull/65</a></p><p><a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/24">https://github.com/Terasology/LightAndShadowResources/pull/24</a></p><br clear="none"/></div>
<div><br clear="none"/></div>
GSoC Week 3: Choosing Sideshttps://dacharya64.postach.io/post/gsoc-week-3-choosing-sides2018-06-07T03:18:24.064000Z2018-06-07T02:29:11ZDevi Acharya<div>Week 3 of Google Summer of Code is done! This week I focused on continuing the faction code, making it so that players could choose their team (red or black) at the start of the game and, upon selection, get teleported to their team's base. <br clear="none"/></div>
<div><br clear="none"/></div>
<div>I'd already started some of the faction code last week, though due to the fact that I had some odd issues with my workspace I wasn't able to get this fully completed and tested. Once I started trying to work out my new code, I realized things weren't going to be as straightforward as I thought they'd be. </div>
<div><br clear="none"/></div>
<div>First off, I was having some issues with the Dialog module in terms of pressing dialog buttons to cause certain actions to fire. There were some issues figuring out how to fire multiple actions in dialog, with the dialog buttons not causing the desired action and leaving me unsure of why--if it had to do with the action not being fired by the dialog button, or something else along the line that wasn't working. </div>
<div><br clear="none"/></div>
<div>I decided to switch over to having a system of teleporters instead, a red and black one placed on the platform which the player could activate to join that team and teleport to that team's base (<a shape="rect" href="https://forum.terasology.org/threads/request-for-module-teleporters.1392/" target="_blank">based on this forum post</a>). I added teleporters to the rasterization of the floating platform, and changed up the NPC's dialog to reflect this (instructing the player to activate the appropriate teleporter to start). </div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div style="text-align: center;"><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/dc0de6d8-87a1-405f-ac9c-0aa80dca493f/ed54e02f-679d-4603-a938-335d87c24d9b.jpg" /><br clear="none"/></div>
<div style="text-align: center;"><em>Pick your side!</em><br clear="none"/></div>
<div style="text-align: center;"><br clear="none"/></div>
<div style="text-align: left;">The teleporter system was giving me some trouble at first--it appeared to not be firing on activate in the same way as the dialog system was acting up! I realized, though, that I was missing a <span style="font-family: "courier new", courier, monospace;">@RegisterSystem(RegisterMode.AUTHORITY)<span style="font-family: gotham, helvetica, sans-serif;">at the beginning of the TeleporterSystem class, which cleared that problem up.</span></span></div>
<div style="text-align: left;"><span style="font-family: "courier new", courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></span></div>
<div style="text-align: left;"><span style="font-family: "courier new", courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;">The teleporter system works when a teleporter is activated, the system takes the player (<span style="font-family: "courier new", courier, monospace;">EntityRef player = event.getInstigator();</span>) and sets their LASTeam component to the same as the teleporter they are activating. It then sends a teleport event causing the player to teleport to their team's base (right now these are hardcoded coordinates close to the flag). They can pick up the enemy's flag, but not their own.</span></span></div>
<div style="text-align: left;"><span style="font-family: "courier new", courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></span></div>
<div style="text-align: left;"><span style="font-family: "courier new", courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;">Another interesting thing I learned along the way was regarding testing--I'd built a UI structure to check the player's team, but thanks to a tip I learned I can just use <span style="font-family: "courier new", courier, monospace;">dumpEntities</span> in the console to check the team component of the player.</span></span></div>
<div style="text-align: left;"><span style="font-family: "courier new", courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></span></div>
<div style="text-align: left;"><span style="font-family: "courier new", courier, monospace;"><span style="font-family: gotham, helvetica, sans-serif;">I was hoping to get the win detection and scoring UI set up this week, and while I've started on some of that code it's not ready yet. I'm hoping next meeting to solidify the best way to determine win condition (entering a region? collision with friendly base?) and to start testing out how to access what's in a player's inventory. The main game loop is almost there, and soon to come will be guns--which I think will be the most difficult of what I've tackled so far, but also super rewarding once it comes together. </span></span></div>
<div><br clear="none"/></div>
<div><p>Pull Requests for this week: </p><p><a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/65">https://github.com/Terasology/LightAndShadow/pull/65</a></p><p><a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/24">https://github.com/Terasology/LightAndShadowResources/pull/24</a></p><br clear="none"/></div>
<div><br clear="none"/></div>
GSoC Week 2: Teaming Uphttps://dacharya64.postach.io/post/gsoc-week-2-teaming-up2018-05-31T05:54:53.026000Z2018-05-31T02:56:18ZDevi Acharya<div>It's week 2 of Google Summer of Code! This meant taking the next step in the project--working on implementing factions. </div>
<div><br clear="none"/></div>
<div>The idea of factions is simple--the player will choose a team to be on, red or black, and depending on their current faction they will be able to interact with the world in different ways. For instance, a player cannot pick up their team's flag when the flag is at the base. </div>
<div><br clear="none"/></div>
<div>To begin, I worked on tracking the player's own faction. Thankfully, some of the existing code in the Light and Shadow module made this easier. The previously created LASTeam component keeps track of the team of the item it's a component of as a String. I attached an LASTeam component to the player using a delta of player.prefab: </div>
<div><br clear="none"/></div>
<div style="padding-left: 30px;"><span style="font-family: 'courier new', courier, monospace;">{</span><br clear="none"/><span style="font-family: 'courier new', courier, monospace;"> "LASTeam" : {</span><br clear="none"/><span style="font-family: 'courier new', courier, monospace;"> "team" : "white"</span><br clear="none"/><span style="font-family: 'courier new', courier, monospace;"> }</span><br clear="none"/><span style="font-family: 'courier new', courier, monospace;">}</span></div>
<div><br clear="none"/></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;">I set the team initially to white because part of the idea of the L&S world is that players begin as part of a neutral faction (the white faction) and can join the red or black teams. I then added some logic to the flag pickup statements so that you can only pick them up if you are on the opposite team.</span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;">Changing a line in TakeBlockInActivationSystem:</span></div>
<div><span style="font-family: 'courier new', courier, monospace;">if (flagTeamComponent.team.equals("red") && playerTeamComponent.team.equals("black")) {<br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;">Note: This will need tweaking once players pick up and drop flags places, since you should not be able to pick them up only when they are on the base. </span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;">Finally, I set the flag blocks as non-destructible (by setting their mass to 0 in LightAndShadowResources) so that the block can only be taken by pressing <span style="font-family: 'courier new', courier, monospace;">E</span> rather than destroying it, so taking the flags and checks needed for that only went through one system. </span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;">These changes can be seen in these pull requests: </span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/65" target="_blank">https://github.com/Terasology/LightAndShadow/pull/65</a><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/24" target="_blank">https://github.com/Terasology/LightAndShadowResources/pull/24</a> (needs to be rebased by me)<br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;"><br clear="none"/></span></div>
<div><span style="font-family: gotham, helvetica, sans-serif;">After this, I started working on some more changes. I decided to switch over the the main LightAndShadow world, just adding the BaseProvider and BaseRasterizer to the world gen lineup, because it already came with the previously created platform and dialog to choose which faction you'd be a part of. (Note: Still need to figure out how to get the y axis of the platform to spawn just above ground level, rather than a fixed y coordinate). </span></div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/7ab41a18-efd0-49a4-a736-a8afc3fc2c61/6e11891f-0382-46ad-840d-dede5eb904ab.jpg" /></div>
<div style="text-align: center;"><em>Ready to jump off this platform and fight</em></div>
<div><div><span> </span></div>
<div><span>I edited the current dialog for the faction-giving NPC to allow the player to join red or black team, and teleport them to the base.</span></div>
<div><span> </span></div>
<div><span>Unfortunately at some point here the game began to crash and throw some error in an unrelated module, and led me down a path of trying to fix something wonky going on in my workspace. As of writing this, I just un-borked whatever the problem was, so tomorrow I'm going to go back through the code I've been working on to ensure it works before pushing.</span></div>
<div><span> </span></div>
<div><span>I'll cover this code in more detail once I get it working (next week's blog post). </span></div>
<div><span> </span></div>
<div><span>Figuring out how to fix this and push my new changes for this week is top priority, after which is figuring out what to do next. I'd like to start working on UI for teams/scoring as well as setting up the logic for the scoring--where the player returns to base with the opposing team's flag and scores a point--as per suggestions from last week. Also super useful would be multiplayer testing! Hopefully can try out more of that in days to come.</span></div><br clear="none"/></div>GSoC Week 1: Blocks, flags, and a simple dirt worldhttps://dacharya64.postach.io/post/gsoc-week-1-blocks-flags-and-a-simple-dirt-world2018-05-23T18:36:44.136000Z2018-05-23T13:18:28ZDevi Acharya<div>Summer break has begun, and with it, <a shape="rect" href="https://summerofcode.withgoogle.com/" target="_blank">Google Summer of Code</a>! I'm fortunate to be working on <a shape="rect" href="http://terasology.org/" target="_blank">Terasology</a> creating a new capture the flag gamemode in the module Light and Shadow.</div>
<div><br clear="none"/></div>
<div>For those learning to learn more about the project in general and check out the estimated timeline for the project, you can check out the proposal here: <a shape="rect" href="https://docs.google.com/document/d/1jCgZtg78jGBTu3KNzxFbrDIJ0beEWK-dzr-53P_JN5o/edit?usp=sharing">https://docs.google.com/document/d/1jCgZtg78jGBTu3KNzxFbrDIJ0beEWK-dzr-53P_JN5o/edit?usp=sharing</a></div>
<div><br clear="none"/></div>
<div>This week has been dedicated to learning the feel of the code and making sure I can make the first steps to making my whole proposal come to life. For Week 1, this has meant making sure I can cover the bases. I've worked this week on creating a simple world to use as a sandbox for building up the rest of the gameplay. </div>
<div><br clear="none"/></div>
<div>This included creating a way to generate both bases (for now a simple 5x5 stone structure) and place a red flag and black flag on either side. </div>
<div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/c2bc0d30-4794-4ede-bd3d-f186a220bf6e/f2ef284b-e647-4c10-8cb2-e63ba39a6c8f.jpg" /></div>
<div style="text-align: center;"><em>Stealthily approaching the red base</em></div>
<div><br clear="none"/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/c2bc0d30-4794-4ede-bd3d-f186a220bf6e/8c10010e-d2ee-40bf-a5a5-49d6449b74ab.jpg" /></div>
<div style="text-align: center;"><i>Two bases face each other in a standoff</i></div>
<div style="text-align: center;"><i><br clear="none"/></i></div>
<div style="text-align: left;">A lot of figuring things out has just been trying to decode how all of the various systems work together (How does a generator work with a rasterizer? What can I get components to do?). There were issues along the way with bases being cut off while rasterized, or just appearing everywhere. I've also been getting used to all the conventions to follow to get my workflow down, such as making sure that my code is stylistically correct and creating javadocs along the way. </div>
<div style="text-align: left;"><br clear="none"/></div>
<div style="text-align: left;">Overall, though, I got done what I was looking to complete this week: </div><ul><li style="text-align: left;">Created a new world generator that creates a simple, flat world off of which I can build</li><li style="text-align: left;">Created the elements needed to spawn a the bases and flags within the world (Base.java, BaseProvider, BaseRasterizer, and BaseFacet) that hold the code needed to understand what a base is and place it within the world at a given set of coordinates on world generation. </li><li style="text-align: left;">Created logic to allow the flag to be picked up by pressing `E`, or by hitting it once</li><li style="text-align: left;">Created prefabs for both flags and applied the LASTeam component so each can be identified as red or black, respectively</li></ul><div>You can check out this week's work at <a shape="rect" href="https://github.com/Terasology/LightAndShadow/pull/64">https://github.com/Terasology/LightAndShadow/pull/64</a> and <a shape="rect" href="https://github.com/Terasology/LightAndShadowResources/pull/23,">https://github.com/Terasology/LightAndShadowResources/pull/23,</a> respectively. </div>
<div><br clear="none"/></div>
<div>Right now the game isn't much to look at, but there's progress there. But there's still a core problem with the gameplay--right now I can pick up and run around with two flags! It's not really a game of capture the flag at this point, yet.</div>
<div><br clear="none"/></div>
<div>That's why next week I'm hoping to focus on the faction code, allowing players to join a team and having their team affiliation affect things (like whether they're able to pick up a given flag). Things to be determined include how players can pick their team, and how to best regulate what people can and can't do, depending on their team affiliation. Hopefully these are things we can brainstorm about in tomorrow's meeting! </div>
Game Jams!https://dacharya64.postach.io/post/game-jams2018-03-04T02:20:27.067000Z2018-03-04T01:54:33ZDevi Acharya<div>Worked on two game jams recently and wanted to share what I worked on here!</div>
<div> </div>
<div><img alt="" title="" /></div>
<div><b>Global Game Jam </b>(theme: Transmission): Worked on UI design / implementation for Patient Zero, where you get to be an infection spreading through the body! Made in Unity in 48 hours, with a team from Iowa State. </div>
<div><br /></div>
<div><img alt="" title="" /><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/8564e677-6600-4ae0-8199-536ba2e87edc/c1446105-0ac0-4308-b210-f75e5603c388.png" /></div>
<div><br /></div>
<div>Play here: <a href="https://globalgamejam.org/2018/games/patient-zero-10">https://globalgamejam.org/2018/games/patient-zero-10</a></div>
<div><br /></div>
<div><br /></div>
<div><b>Twine Games Jam </b>(theme: retelling fairytale or legend): Completed Daedalus, a game made with Unity and Twine. It is a retelling of the story of Daedalus and Icarus told from within the labyrinth. </div>
<div><br /></div>
<div>It won 3rd place for <b>Best Use of Multimedia</b>!</div>
<div><br /></div><br /><div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/8564e677-6600-4ae0-8199-536ba2e87edc/352a6109-07e8-48d2-a388-e0255fb057c1.jpg" /></div>
<div><div style="font-family:"Helvetica Neue", Arial, sans;font-size:16px;"><br /></div></div><div style="font-family:gotham, helvetica, arial, sans-serif;font-size:14px;">Play here: <a href="https://dacharya64.itch.io/daedalus">https://dacharya64.itch.io/daedalus</a></div>
Let's Make A Super Simple Unity Game! Part 1: Movementhttps://dacharya64.postach.io/post/let-s-make-a-super-simple-unity-game-part-1-movement2018-02-08T00:20:22.048000Z2018-02-07T03:13:55ZDevi Acharya<div>Before you start, download Unity here: <a href="https://unity3d.com/get-unity/download">https://unity3d.com/get-unity/download</a></div>
<div><br /></div>
<div><b>Let's start with the basics -- </b></div>
<div>Take a look at the Hierarchy, Scene Window, Inspector, and Assets pane. What do each of them do? </div>
<div>Look at how to manipulate the Scene Window -- zoom in, out, pan. </div>
<div>Look at how to make new objects by right-clicking in the Assets or Hierarchy pane (and what the difference is) </div>
<div>Look at how to select objects and change their properties either using W, E, R or changing values in the Inspector window</div>
<div><br /></div>
<div>What are the default things that come with the scene? (look in hierarchy). What do they do? </div>
<div><br /></div>
<div><br /></div>
<div><b>Let's make a player character -- </b></div>
<div>Create a new plane scaled up on the Y axis. </div>
<div>Create a new cube, position it above the plane. Add a rigidbody component. (What does this do?)</div>
<div>Position the camera where you want it to be default, then make it a child of the cube</div>
<div>Make a new material, add it to the floor (or player)</div>
<div>Let's let the player move forward, back, and jump up. </div>
<div>Use this script: <a href="https://gist.github.com/dacharya64/119a775dc10d9f13919d1d7e37ec8282">https://gist.github.com/dacharya64/119a775dc10d9f13919d1d7e37ec8282</a></div>
<div>Fix the code! </div>
<div>Show how to modify public values in Inspector</div>
<div><br /></div>
<div><b>Let's make some obstacles -- </b></div>
<div>Make a new wall (whatever primitive you want) </div>
<div>Showing how to create a new prefab 'wall'</div>
<div>Make some copies of wall prefab</div>
<div>Apply a material to one instance of the prefab, then apply across all prefabs</div>
<div><br /></div>
<div><br /></div>
<div>Download the Unity project here: <a href="https://github.com/dacharya64/SampleGame">https://github.com/dacharya64/SampleGame</a></div>
<div><br /></div>
<div><br /></div>
<div><span style="font-size: 18px;">What's next? Some possibilities:</span></div>
<div>-Creating a GUI and menus</div>
<div>-Creating collectibles and transitioning between scenes</div>
<div>-Creating and adding materials / textures</div>
<div>-Importing your own 3D assets</div>
<div>-More code (movement, collision, etc)</div>
<div>-More game genres (shooter, open world, etc) </div>
<div><br /></div>
<div>And more...!</div>
<div><br /></div>
<div><br /></div>
<div><br /></div>
<div>//Code</div>
<div><br /></div><table style="box-sizing: border-box; border-spacing: 0px; border-collapse: collapse; tab-size: 8; color: rgb(36, 41, 46); font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;width:100%;"><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(215, 58, 73);">using</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">System.Collections</span>;</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(215, 58, 73);">using</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">System.Collections.Generic</span>;</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(215, 58, 73);">using</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">UnityEngine</span>;</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;">
</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(215, 58, 73);">public</span> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">class</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">PlayerMovement</span> : <span style="box-sizing: border-box; color: rgb(111, 66, 193);">MonoBehaviour</span> {</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> </td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">public </span><span style="box-sizing: border-box; color: rgb(215, 58, 73);">float</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">speed</span>; <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//how fast the player moves</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">public </span><span style="box-sizing: border-box; color: rgb(215, 58, 73);">float</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">jumpForce</span>; <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//how high the player jumps</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;">
</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//Private Vars</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">private </span><span style="box-sizing: border-box; color: rgb(111, 66, 193);">Rigidbody</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">rb</span>;</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;">
</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">// Use this for initialization</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">void</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">Start</span> () { </td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//get the rigidbody compoment of what this is attached to (ex. the player)</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> rb = GetComponent<Rigidbody>();</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> }</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> </td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">// Update is called once per frame</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">void</span> <span style="box-sizing: border-box; color: rgb(111, 66, 193);">Update</span> () {</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">if</span> (Input.GetKeyDown(KeyCode.W)) { <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//JUMP</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> rb.velocity = transform.up * jumpForce;</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> }</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">if</span> (Input.GetKey(KeyCode.A)) { <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//MOVE LEFT</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> transform.position += Vector3.left * speed * Time.deltaTime;</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> }</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(215, 58, 73);">if</span> (Input.GetKey(KeyCode.D)) { <span style="box-sizing: border-box; color: rgb(106, 115, 125);">//MOVE RIGHT</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">// **How do you rewrite the 'move left' code for moving right?**</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">// Answer below</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> }</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"> }</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;">}</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;">
</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"><span style="box-sizing: border-box; color: rgb(106, 115, 125);">/*</span></span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * </span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * </span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * </span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * </span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * </span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * </span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> * SOLUTION: transform.position += Vector3.right * speed * Time.deltaTime;</span></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0px 10px; width: 50px; min-width: 50px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgba(27, 31, 35, 0.3); text-align: right; white-space: nowrap; vertical-align: top; cursor: pointer; user-select: none;"><br /></td><td style="box-sizing: border-box; padding: 0px 10px; position: relative; vertical-align: top; overflow: visible; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; color: rgb(36, 41, 46); word-wrap: normal; white-space: pre;"><span style="box-sizing: border-box; color: rgb(106, 115, 125);"> <span style="box-sizing: border-box; color: rgb(106, 115, 125);">*/</span></span></td></tr></tbody></table><div><br /></div>
<div><br /></div>
PANTHEON: a game about being the best godhttps://dacharya64.postach.io/post/pantheon-a-game-about-being-the-best-god2018-11-06T02:57:55.235000Z2018-01-16T21:41:06ZDevi Acharya<div>Looking for a new board game to play? Look no further than PANTHEON, a competitive deck-building board game about being the best god you can be! Compete for followers, accrue faith, and take down your opponents in deific fashion. </div>
<div><br /></div>
<div>Pantheon is a game I helped to make with Morgan Mayback for Brandeis's Fantasy Worlds English class. For the final project (making a fantasy world), we worked on creating a tabletop game featuring a rich pantheon of gods all vying for control over the land. Morgan worked on the story and god designs for the game, and I worked on the rulebook and game design. </div>
<div><br /></div>
<div><span style="font-size: 18px;"><span style="font-size: 18px; font-weight: bold;">Designing the Rules </span></span></div>
<div><br /></div>
<div><span style="font-weight: bold; font-family: gotham, helvetica, arial, sans-serif; font-size: 14px;">The rulebook</span><span style="font-size: 16px; font-family: "Helvetica Neue", Arial, sans;">: </span><a href="https://docs.google.com/document/d/1eqrJa-Q8CfgnClULRVkkZlAWG_sazJkzbv0075AyYdg/edit?usp=drive_web" style="font-size: 14px; font-family: gotham, helvetica, arial, sans-serif;">Fantasy Worlds Project</a></div>
<div><br /></div>
<div>The rules of Pantheon are loosely based on other tabletop strategy games such as Dominion and Settlers of Catan. There is a central board where players can move their player pawn throughout the world and discover different events and buildings within that world. </div>
<div><br /></div>
<div>When designing the rules, I wanted to look at a couple of different things: </div>
<div><br /></div><ul><li><div><span style="font-weight: bold;">Multiple paths to victory</span> -- Players can attempt different approaches to the game and have a chance of winning when playing strategically, for instance buying buildings versus buying followers early on</div></li><li><div><span style="font-weight: bold;">Balance of Events and Buildings</span> -- I wanted to make sure that the cards revealed to the players were properly balanced, with different numbers of cards (and more Event cards than Building cards) based on the accumulation of player wealth in the game</div></li><li><div><span style="font-weight: bold;">Player balance and competition</span> -- I wanted to ensure one player couldn't pull ahead of others and make it impossible for other players to achieve victory early and mid-game</div></li><li><div><span style="font-weight: bold;">Meaningful differences between cards</span> -- While making sure that no cards were underpowered or overpowered, I wanted there to still be meaningful differences in the cards that could be acquired, especially in terms of different strategies and how cards interact with one another</div></li><li><div><span style="font-weight: bold;">Tweaking different variables </span>-- the deck size and composition, number and location of players, and layout of the board all had an impact on the overall balance of the game </div></li></ul><div><br /></div>
<div>tl;dr -- the challenges were keeping things somewhat randomized but also meaningful; allowing all players to succeed while still rewarding good play</div>
<div><br /></div>
<div><br /></div>
<div><span style="font-size: 18px;"><span style="font-size: 18px; font-weight: bold;">Creating the Game</span></span></div>
<div><br /></div>
<div>To begin with, for rudimentary testing, I created a basic paper prototype out of paper and playing cards:</div>
<div><br /></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/338ab7e3-dbdb-4b69-a971-103f6c63133f/74fd0408-8251-4bf0-9814-4ffc739f7f9f.jpg" /><br /></div>
<div> <img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/338ab7e3-dbdb-4b69-a971-103f6c63133f/df55b465-0120-4093-aef5-87afce731227.jpg" /><br /></div>
<div><br /></div>
<div>In order to make a playable version of the game, we had to create all the different game components. We created the board out of laser cut wood (with laser-etched tiles). Cards were printed out of cardstock and cut by hand; I made the original templates in Photoshop and generated PDFs for printing. Player tokens were 3D printed PLA, and the box was a repurposed shipping box covered with duct tape and then an illustrated map. Some pics below: </div>
<div><br /></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/338ab7e3-dbdb-4b69-a971-103f6c63133f/7333b6e2-02d9-43e0-afc5-40e2a70c0196.jpg" /><br /></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/338ab7e3-dbdb-4b69-a971-103f6c63133f/a63f8cd7-1d9b-446d-9b34-e5c2382ee167.jpg" /><br /></div>
<div><br /></div>
<div><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/338ab7e3-dbdb-4b69-a971-103f6c63133f/f0863a4c-e290-47e3-aae2-8180deaf6c46.jpg" /><br /></div>
<div><br /></div>
<div><span style="font-size: 14px; font-family: gotham, helvetica, arial, sans-serif;">NOTE: Building and Event card artwork is not our original work and we own no rights to it. It is merely there as a placeholder. </span></div>
<div><br /></div>
<div><span style="font-size: 18px;"><span style="font-size: 18px; font-weight: bold;">Feedback, Beta-Testing, and Post-Mortem </span></span></div>
<div><br /></div>
<div>We presented the game during a showcase night of all the Fantasy Worlds projects and others got to try out the game for the first time. Elements of the game still need work, especially in terms of balancing the different abilities of the gods and randomized events. All in all, though, it was fun to work on and produce this great beta version! </div>
<div><br /></div>
<div><br /></div>
<div><span style="font-size: 18px;">Want to play the game, remix it, or just check out more details? You can get all the materials you need to play here: <a href="https://drive.google.com/open?id=1_Ql2zD8bH_U23XbKN4s3gs5ZCTEFTvMV" style="font-size: 18px;">Fantasy Worlds</a></span></div>
<div><br /></div>
<div style="font-size: 14px;"><br /></div>
<div style="font-size: 14px;"><br /></div>
<div><br /></div>
<div><br /></div>
<div><br /></div>
<div><br /></div>
Curated Corner: A Sortable List of Upcoming Events!https://dacharya64.postach.io/post/curated-corner-a-sortable-list-of-upcoming-events2018-01-16T20:57:46.466000Z2017-12-16T22:02:46ZDevi Acharya<div>So I have a lot of browser bookmarks. Theoretically this is to keep me organized, but I've found that it's particularly unhelpful for when I have a list of conferences and events. In this case I still have to go through each page to look at the dates / prices / locations for each event and then subsequently forget them all and go through the same process again. </div>
<div><br /></div>
<div>To help alleviate some of that, I created a web page to help me keep track of interesting events for this year: <a href="http://www.devi-a.com/CuratedCorner/">http://www.devi-a.com/CuratedCorner/</a></div>
<div><br /></div>
<div>It features sortable lists and meetups cover areas that I'm interested in, like art, tech, and design. Feel free to check it out at that website, or fork the repo here: <a href="https://github.com/dacharya64/CuratedCorner">https://github.com/dacharya64/CuratedCorner</a></div>
<div><br /></div>
<div><br /></div><br/><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/f183d9a4-750d-4114-9e48-411daadcf4b7/8262c1ba-76d3-4366-9c57-27c4ce03a6e5.png" />New Website Up!https://dacharya64.postach.io/post/new-website-up2017-11-12T18:57:37.631000Z2017-11-12T18:10:28ZDevi Acharya<div>Every once in a while I get the urge to redo how I'm presenting myself and my work on the web. Since I'm working on a lot of different things at once it's important for me to keep things that need to be continually updated (like this website) easy to maintain and clear for people using them. </div>
<div><br /></div>
<div>So here it is, presenting the new portfolio! -- <a href="http://www.devi-a.com">www.devi-a.com</a> </div>
<div><br /></div>
<div>And for when that changes, some pics for good measure: </div>
<div><br /></div>
<div><br /></div><br /><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/39dc9cf5-c501-49af-a05a-d1ad72d66431/b3ca7dc2-658f-478b-bc97-4ff714d09744.jpg" /><br /><img src="https://cdn-images.postach.io/897b43bc-53d4-4a88-9448-626272b018e0/39dc9cf5-c501-49af-a05a-d1ad72d66431/ee696740-9985-4b8b-aef4-cb38c9b9f776.jpg" />Introducing Skyfinder: A lightweight tabletop RPG systemhttps://dacharya64.postach.io/post/introducing-skyfinder-a-lightweight-tabletop-rpg-system2017-09-06T15:19:07.567000Z2017-08-30T19:14:12ZDevi Acharya<div>When looking at a D&D campaign I could run with friends, I found that pre-existing RPG systems are <i>complicated</i>. Of course I knew this to begin with, but going through the loads of text on lore, rules, mechanics, etc. I realized that what I really wanted was a system that simplified many of the rules, weighted things a bit differently, and was more accessible both for players and DMs, while still having substance. </div>
<div><br /></div>
<div>Because I played Pathfinder before, much is heavily sourced from Pathfinder's <a href="http://d20pfsrd.com">System Reference Document</a>. I also wanted to include a spacefaring mechanic and my initial thought went to <a href="http://www.failbettergames.com/sunless/">Sunless Sea</a>, a top-down RPG where you sail with a crew and manage resources (and story encounters). I looked into it and it turns out someone made a Sunless Sea tabletop RPG system, <a href="http://ponderingsongames.com/2016/04/27/sunless-fate/">Sunless Fate</a>, which uses the <a href="https://www.evilhat.com/home/atomic-robo/">Atomic Roboto</a> /<a href="https://fate-srd.com"> Fate SRD</a>. So some of my mechanics are <s>lifted from</s> <i>remixed</i> from those sources. </div>
<div><br /></div>
<div>Before going on to talk about it, here's a link so you can read the rules and / or run the game yourself: <b style="color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><a href="https://tinyurl.com/skyfinderrpg">https://tinyurl.com/skyfinderrpg</a></b></div>
<div><b><span style="color: rgb(0, 0, 0);"><br /></span></b></div>
<div><span style="color: rgb(0, 0, 0);">Now, onto a bit of what the system has to offer: </span></div>
<div><span style="color: rgb(0, 0, 0);"><br /></span></div>
<div><b><span style="color: rgb(0, 0, 0);">Ability Scores and Skills</span></b></div>
<div><b><span style="color: rgb(0, 0, 0);"><br /></span></b></div>
<div><font color="#000000">The core of the game is based around a player's chosen ability scores and skills, with players rolling checks (1d20 + modifier) to determine the effects of their actions (usually success or failure, though this can differ depending on the DM / story). There are the six traditional ability scores (</font><font color="#000000"><b>Strength</b>, <b>Dexterity</b>,<b> Constitution</b>,<b> Intelligence</b>,<b> Wisdom</b>,<b> Charisma</b></font><font color="#000000">) and twelve skills, two of each which use a given ability score as its base. Skills are as follows: </font></div>
<div style="margin-left:40px;"><span style="color: rgb(0, 0, 0);"><br /></span></div>
<div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Intimidate (STR):</span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;"> Your physical ferocity can scare others into doing what you want. </span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Force (STR):</span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;"> You can break down any barrier or item you need. </span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Stealth (DEX): </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">You can stay out of sight of enemies and move without a sound.</span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Acrobatics (DEX): </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">You can more easily climb, jump, and maneuver. </span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Knowledge (INT): </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">You know more about the world around you, from local lore to knowledge of </span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">the universe’s workings. </span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Handicraft (INT): </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">You are able to understand and take apart devices and machines.</span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Perception (WIS):</span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;"> You are better able to notice your surroundings, especially when things look out of place.</span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Survival (WIS): </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">You have the basic skills needed to survive in the Void -- or anywhere, really.</span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><span style="font-weight: 700;">Bluff (CHA): </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">You can can convince anyone (or anything) that you’re speaking the truth. </span></div></div><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div><br /></div></div><div style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div style="margin-left:40px;"><span style="font-weight: 700;">Perform (CHA):</span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;"> You can put on dazzling displays to please any audience.</span></div></div><div style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div><br /></div></div></div><div>Ability scores and skill points are allotted at character creation and also help with saves (Reflex, Fortitude, and Will, like in D&D). </div>
<div><br /></div>
<div><b><br /></b></div>
<div><b>Classes and Traits</b></div>
<div><b><br /></b></div>
<div>Classes are as follows: </div><div>
<div style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><b><br /></b></div>
<div style="margin-left:40px;"><span style="font-weight: 700;">Engineer: </span><span style="font-style: italic;">Makes sure things keep working the way they ought to.</span> <span style="font-weight: 700;">+1 Handicraft</span>, can convert some inventory items to <span style="color: rgb(0, 0, 0); text-decoration: none; vertical-align: baseline; font-style: normal; font-weight: 700;">fuel</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><span style="font-weight: 700;">Medic: </span><span style="font-style: italic;">Skilled at saving lives, even if it means removing a few limbs in the process. </span>Can <span style="font-weight: 700;">stabilize </span>allies in combat; can assist allies with <span style="font-weight: 700;">CON </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">saves</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><span style="font-weight: 700;">Gunner: </span><span style="font-style: italic;">Can shoot anything that moves, and usually anything that doesn’t. </span><span style="font-weight: 700;">+1 Acrobatics, </span>bonus to <span style="font-weight: 700;">ranged </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">attacks</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><span style="font-weight: 700;">Navigator: </span><span style="font-style: italic;">Able to guide just about anything by the light of the stars. </span><span style="font-weight: 700;">+1 Knowledge, </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">reduces fuel consumption by 25% (does not stack)</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><span style="font-weight: 700;">Chef: </span><span style="font-style: italic;">Responsible for feeding the crew with whatever is on hand. </span><span style="font-weight: 700;">+1 Survival, </span>can convert some inventory items into <span style="font-weight: 700;">supplies</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><span style="font-weight: 700;">Warden: </span><span style="font-style: italic;">Keeps people in line -- friend or foe. </span><span style="font-weight: 700;">+1 Force, </span>bonus to <span style="font-weight: 700;">melee </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">attacks</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px 0px 0px 40px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div><span style="font-weight: 700;">Explorer: </span><span style="font-style: italic;">Here to see what wonders the Void has to offer. </span><span style="font-weight: 700;">+1 Stealth, </span>can assist allies in <span style="font-weight: 700;">DEX </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">saves.</span></div></div><p style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; height: 11pt; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"></p><div style="margin: 0px; color: rgb(0, 0, 0); padding-top: 0pt; padding-bottom: 0pt; orphans: 2; widows: 2; text-align: left; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><div style="margin-left:40px;"><span style="font-weight: 700;">Entertainer: </span><span style="font-style: italic;">The life of any party, even when others don’t want them to be. </span><span style="font-weight: 700;">+1 Perform, </span>can assist allies with <span style="font-weight: 700;">WIS </span><span style="color: rgb(0, 0, 0); font-weight: 400; text-decoration: none; vertical-align: baseline; font-style: normal;">saves</span></div>
<div style="margin-left:40px;"><br /></div>
<div>Classes are meant to be a mix of flavor and mechanics. Choosing a specific class will affect some mechanics and thus, how you play your character (for instance, a Warden is going to be slightly better a fighter at level 1) but they are meant to be templates on which you can expand. They are also designed off positions in a ship, so if certain roles are missing (gunner, navigator, or chef, for instance), feel free to run with that as a DM and have your players try to creatively try to fulfill those roles in a creative or nontraditional fashion. </div>
<div><br /></div>
<div>Furthermore, classes are not restricted by alignment. Feel free to have a cannibalistic chef or a pacifist gunner. </div>
<div><br /></div>
<div>Traits are similar to classes in that they add flavor but can also be mixed into the mechanics of the game. At character creaton players pick their life goal, history, talent, and flaw, which will help to define them storywise but you can also use these sections to reward good roleplay (for instance, extra XP for pursuing their goal or using their talent). I'd recommend keeping talents short and sweet--something feasible and not game-breaking. Other than that, have at it. </div>
<div><br /></div>
<div><br /></div>
<div><b>Combat and Actions</b></div>
<div><b><br /></b></div>
<div>Actions outside of combat are fairly unrestricted. I've outlined in the guide how some non-combat actions work, but generally this is up to however the DM wants to run it. For combat, actions are more restricted and usually players take turns after initiative order is determined. The guide accounts for melee and ranged attacks, as well as other actions within combat such as flanking, grappling, and charging. </div>
<div><br /></div></div></div><div><span style="color: rgb(0, 0, 0);"><br /></span></div>
<div><b><span style="color: rgb(0, 0, 0);">The World and Navigation </span></b></div>
<div><br /></div>
<div>Although players will likely start in a more populated location (city, planet, space station) sooner or later they may wish to take to the skies. This document outlines some of the mechanics of flight (combat, resource management) as well as some fluff about the different empires that make up the galaxy.</div>
<div><br /></div>
<div>The main things to focus on here are that resource management and encounters (both subject to the DMs whims) are going to be largely influenced by where they are in space. Players should be cautious of venturing too deep into unfriendly territory without the resources (supplies and fuel) to make their escape, since they might get themselves into trouble without any stations willing to give them resources. Furthermore, a player's actions can help or hurt their reputation with given factions, so choices should be made with care.</div>
<div><br /></div>
<div> </div>
<div><b>...and more!</b></div>
<div><b><br /></b></div>
<div>The document handles some other details such as DM tips, random encounters, and items for purchase. Just keep in mind that the document is not exhaustive, and you can pick and choose what you want to keep, change, or remove. In fact, the best way to get started is to check out the document yourself!</div>
<div><br /></div>
<div>--</div>
<div><br /></div>
<div>Want to run it yourself? You can check it out <a href="https://docs.google.com/document/d/e/2PACX-1vSMGcfd211JfLQ-Rl3K9P2IvLmWxUasBRG-SQNgfQsi2FXIz30UkCg38rrYddPnikvOQTSFLKcHg_22/pub">here</a>.</div>
<div><br /></div>
Check out ViveSim, an experiment data simulatorhttps://dacharya64.postach.io/post/check-out-vivesim-an-experiment-data-simulator2017-08-08T02:28:22.721000Z2017-08-01T22:58:49ZDevi Acharya<div>As part of my last week as a member of the research team at Iowa State University, I worked on a simulation for our VR navigation experiment data. </div>
<div><br /></div>
<div>Our experiment involves participants completing a triangle completion task in virtual reality -- walking two legs of a triangle and trying to indicate where they think they started (completing the last leg of the triangle). Using the data we gathered from the experiment I wanted to create a 3D visualization of each of those trials. </div>
<div><br /></div>
<div>The project I then worked on visualized the data by showing the points of the triangle and the participant's response. Here's a bit of what that looks like: </div>
<div><br /></div>
<div><img style="user-select: none; background-position: 0px 0px, 10px 10px; background-size: 20px 20px; background-image: linear-gradient(45deg, rgb(238, 238, 238) 25%, transparent 25%, transparent 75%, rgb(238, 238, 238) 75%, rgb(238, 238, 238) 100%), linear-gradient(45deg, rgb(238, 238, 238) 25%, white 25%, white 75%, rgb(238, 238, 238) 75%, rgb(238, 238, 238) 100%); height: auto;" src="https://media.giphy.com/media/c1NDAAUUPbjMY/giphy.gif" /><br /></div>
<div><br /></div>
<div><br /></div>
<div><b>The Process</b></div>
<div>This was made using a data set based on the experiment I've been working with a team on making and running this summer (repo <a href="https://github.com/dacharya64/ViveGame">here</a>). It was made in Unity, using similar assets to the one in the original project. </div>
<div><br /></div>
<div>The data from the experiment recorded much of the data about each trial, including the marker position and response. One of my teammates extracted this data into a more meaningful .csv file, and I read that .csv file into Unity using the <a href="http://wiki.unity3d.com/index.php?title=CSVReader">CSVReader</a> script. </div>
<div><br /></div>
<div>That script helped me to extract data from the .csv file so that those values -- for instance the values of the marker x and z coordinates -- could be used by other scripts to place different items and make landmarks appear and disappear when needed. </div>
<div><br /></div>
<div>I then added UI elements that displayed the participant number and the navigation condition for each trial. I also added functionality to switch between an orthographic and perspective camera and let the camera move through the environment. </div>
<div style="text-align: center"><b><br /></b></div>
<div><b>Future Goals</b></div>
<div>I'm hoping to add in data that uses the data on the time and HMD positions to create simulated recreations of the trials, complete with the participant's position over time and eventually their response.</div>
<div><b><br /></b></div>
<div><b><br /></b></div>
<div><b>Try the Demo</b></div>
<div>The project is built in Unity and available both as a Unity project and downloadable .exe from the Github repository: <a href="https://github.com/dacharya64/ViveSim">https://github.com/dacharya64/ViveSim</a></div>
<div><b><br /></b></div>
Some musings on storytelling and techhttps://dacharya64.postach.io/post/some-musings-on-storytelling-and-tech2017-07-28T03:34:16.881000Z2017-07-28T01:20:05ZDevi Acharya<div>Because to be honest, I've started to look at the GRE prep stuff and I feel woefully underprepared. Which is okay, I still have time -- that's the whole point of looking at these things now -- but still. It's one more thing to worry about.</div>
<div><br /></div>
<div>What are the other things taking up time? Working on the Hacking Arts website, and I think my brain is still trying to sort out Perl problems I was struggling with this morning. Starting a new language just makes me appreciate how much easier the ones I've already learned parts of are. You'd think they'd make it as easy as possible to start off with a new language, but it's a struggle -- I'm just grateful it'll never be as bad as learning the very fundamentals all over again. I really want to get this thing working where I can take the time and positional tracking data from this Unity project and use that to create simulations of actual triangle completion tasks. </div>
<div><br /></div>
<div>Will puzzle about that more tomorrow, on the plus side here's an amazing subreddit I just found: <a href="https://www.reddit.com/r/CivDadJokes">https://www.reddit.com/r/CivDadJokes</a></div>
<div><br /></div>
<div>--</div>
<div><br /></div>
<div>Also -- I mentioned last post (or the one before that?) that I should write about that idea that I had. Right. Well, I figured I'm very interested in storytelling, but in particular the sort of communal storytelling that's done in tabletop RPGs (like D&D). It's strange, the sort of thing, but I feel also very natural -- seems like it has roots in older forms of storytelling, the communal elements of oral / folk history and fairytales, but also brings out a different side in people, gives a safe space to open up and have discussions, bring up controversies and solve them while abstracting away the things that are difficult to see them in a new light (ie sci fi / fantasy / spec fic does, but particularly sci fi a la star trek). Would love to look into how these dynamics are created and sustained, how the act of forming these communal stories works, and how it is similar and dissimilar to other forms of writing, storytelling, art, performance -- something there one minute and gone the next. </div>
<div><br /></div>
<div>Just a tiny side note that this I feel is missing in some of these modern day adaptions of tabletop -- it lacks the heart that D&D does, that communal presence. FPS (ex Skyrim) tries to get around this by creating different sorts of interactions, others like MMOs have a community but lacks the specialness and singularity of a campaign where only your small band is the hero, doing something no one has done before. If we want people to buy in to new worlds and new tech, we need to be able to create these same spaces for people -- spaces for people to have their own corners, to tell their own stories and to have intimate connections without losing individuality. This is esp. true for VR. </div>
<div><br /></div>
<div>This I think is why there is (or at least I have?) a lot of nostalgia for text-based adventure and old <a href="https://xkcd.com/1782/">IRC chats</a>. For me growing up, I guess that space was forums. Now we've kind of got that going on with some spaces on the Internet -- but the problem is that with the shift of social media onto focusing on real-life identities (and every website eager to offer the same virality and perks of social media) it's so much harder to have a space to live those imaginary lives -- also everything is already sort of offered up to you (best graphics, best images, best content) so it's less of an act of imagination to go into these spaces and wonder for yourself of the world being presented to you (theater of the mind). Some social media offers some room for that (Tumblr). I also think Reddit offers some of that with anonymity, part of why I've come to appreciate it although I'm not anonymous on there. </div>
<div><br /></div>
<div>A thought came to me as I was writing that -- big data (or not that exactly, but info collection) could come into effect there, I can easily see some genius thinking that's the solution to all your problems, to personalize stories even more by tapping into the viewer's own personal interests and tracings of themselves on the web. But not only is that creepy in a Black Mirror kind of way (thinking of you, Nosedive) but it's also a corruption of that same spirit -- twisting something that should be done with those close to you (not necessarily physically close but in a friendship / solidarity kind of way) and making it into something corporate, something meant to persuade you from people who want your money, as much as the outside looks tempting. That's not to say it won't be done though. </div>
<div><br /></div>
<div>Actually, somewhat related, but this whole musing has reminded me of this story: <a href="https://qntm.org/difference">https://qntm.org/difference</a> which is one of my favorite stories, and one that I've been fervently trying to track down for some time now. What's important about that story is that it's talking about how tech can transform our interactions with one another. How we need to be mindful of the spaces that we create with tech -- because the shape itself can determine what we fill it with. </div>
<div><br /></div>
<div><br /></div>