-
Notifications
You must be signed in to change notification settings - Fork 90
Radioactive Detection Implemented #235
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
khalludi
wants to merge
8
commits into
simon987:master
Choose a base branch
from
khalludi:radioactive_cloud
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 6 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
e97770f
Skeleton setup + Tuple Impl
khalludi f526f36
Add getTiles() to calculate tiles between two coords
khalludi 72ea92f
Add Euclidean Distance calculation method from coords
khalludi a3c4c33
Add getAlphaCounts() to Radioactive interface
khalludi 3c16bd3
Implement RadiationDetector's handleInterrupt
khalludi 2aeca6c
Small cleanup
khalludi 0c3a3f0
Add Beta and Gamma particles; added suggestions
khalludi 3b12e2a
Set unique HWID
khalludi File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
158 changes: 158 additions & 0 deletions
158
...adioactive Cloud/src/main/java/net/simon987/pluginradioactivecloud/RadiationDetector.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,158 @@ | ||
| package net.simon987.pluginradioactivecloud; | ||
|
|
||
| import java.util.ArrayList; | ||
|
|
||
| import javax.lang.model.type.UnionType; | ||
|
|
||
| import org.bson.Document; | ||
| import net.simon987.server.assembly.HardwareModule; | ||
| import net.simon987.server.assembly.Status; | ||
| import net.simon987.server.game.objects.ControllableUnit; | ||
| import net.simon987.server.game.objects.GameObject; | ||
| import net.simon987.server.game.objects.Radioactive; | ||
|
|
||
| public class RadiationDetector extends HardwareModule { | ||
|
|
||
| // NEEDS TO BE CHANGED | ||
| // Need to change to whatever the last unique address is | ||
| public static final int DEFAULT_ADDRESS = 0x010F; | ||
|
|
||
| /** | ||
| * Hardware ID (Should be unique) -- NEEDS TO BE CHANGED | ||
| */ | ||
| public static final char HWID = 0x010F; | ||
|
|
||
| /** | ||
| * Helper class for getTiles | ||
| */ | ||
| private class Tuple { | ||
| public final int x; | ||
| public final int y; | ||
|
|
||
| public Tuple(int x, int y) { | ||
| this.x = x; | ||
| this.y = y; | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Finds the tiles between the two tiles located at the given coordinates. The | ||
| * tiles located at the coordinates are not included in the list. | ||
| * | ||
| * @param x0 x-coordinate of first point | ||
| * @param y0 y-coordinate of first point | ||
| * @param x1 x-coordinate of second point | ||
| * @param y1 y-coordinate of second point | ||
| * @return List of tile coordinates. An empty list indicates tiles are next to | ||
| * each other. | ||
| */ | ||
| public ArrayList<Tuple> getTiles(int x0, int y0, int x1, int y1) { | ||
|
|
||
| ArrayList<Tuple> ret = new ArrayList<>(); | ||
| double slope; | ||
| if (x1 > x0) | ||
| slope = (y1 - y0) / (double) (x1 - x0); | ||
| else { | ||
| slope = (y0 - y1) / (double) (x0 - x1); | ||
|
|
||
| // Swap values so that x0 < x1. This preps the following code where y is | ||
| // determined by adding a step value (1) to x0 till it reaches x1. | ||
| int tmp = x1; | ||
| x1 = x0; | ||
| x0 = tmp; | ||
|
|
||
| tmp = y1; | ||
| y1 = y0; | ||
| y0 = tmp; | ||
| } | ||
|
|
||
| // If slope is zero or undefined, return tiles directly along the | ||
| // appropriate cardinal direction. | ||
| if (x0 == x1) { | ||
| int smaller = y0 < y1 ? y0 : y1; | ||
| int larger = y0 > y1 ? y0 : y1; | ||
|
khalludi marked this conversation as resolved.
Outdated
|
||
| System.out.printf("%d %d", smaller, larger); | ||
| for (int i = smaller + 1; i < larger; i++) { | ||
| ret.add(new Tuple(x0, i)); | ||
| } | ||
| } else if (y0 == y1) { | ||
| int smaller = x0 < x1 ? x0 : x1; | ||
| int larger = x0 > x1 ? x0 : x1; | ||
| for (int i = smaller + 1; i < larger; i++) { | ||
| ret.add(new Tuple(i, y0)); | ||
| } | ||
| } else { | ||
| // Find all coordinates with 0.1 step | ||
| int lastX = x0; | ||
| int lastY = y0; | ||
| for (int i = x0 * 10; i < x1 * 10; i += 1) { | ||
| if (i / 10 != lastX || (int) (slope * i / 10) != lastY) { | ||
| // Update last values | ||
| lastX = i / 10; | ||
| lastY = (int) (slope * i / 10); | ||
|
|
||
| // Add new values to array | ||
| ret.add(new Tuple(lastX, lastY)); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| return ret; | ||
| } | ||
|
|
||
| /** | ||
| * Finds the Euclidean Distance between two coordinates. | ||
| * | ||
| * @param x0 x-coordinate of first point | ||
| * @param y0 y-coordinate of first point | ||
| * @param x1 x-coordinate of second point | ||
| * @param y1 y-coordinate of second point | ||
| * @return distance between two points | ||
| */ | ||
| public double getDistanceOfCoords(int x0, int y0, int x1, int y1) { | ||
| return Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2)); | ||
| } | ||
|
|
||
| public RadiationDetector(ControllableUnit unit) { | ||
| super(null, unit); | ||
| } | ||
|
|
||
| public RadiationDetector(Document document, ControllableUnit cubot) { | ||
| super(document, cubot); | ||
| } | ||
|
|
||
| @Override | ||
| public void handleInterrupt(Status status) { | ||
|
|
||
| // Find all game entities in world | ||
| ArrayList<GameObject> entities = new ArrayList<>(unit.getWorld().getGameObjects()); | ||
|
|
||
| // Check for alpha particles by finding Radioactive entities | ||
| int alphaParticles = 0; | ||
| for (GameObject entity : entities) { | ||
| if (entity instanceof Radioactive) { | ||
| // Calculate distance between object and cubot | ||
| double pathLength = getDistanceOfCoords(unit.getX(), unit.getY(), entity.getX(), entity.getY()); | ||
| alphaParticles += ((Radioactive) entity).getAlphaCounts(pathLength); | ||
|
|
||
| // Get all tiles in between cubot and Radioactive entity | ||
| ArrayList<Tuple> tiles = getTiles(unit.getX(), unit.getY(), entity.getX(), entity.getY()); | ||
| for (Tuple tup : tiles) { | ||
| // If intermediary tile is blocked, reduce alphaParticles by 5 | ||
| if (unit.getWorld().isTileBlocked(tup.x, tup.y)) { | ||
| alphaParticles -= 5; | ||
|
khalludi marked this conversation as resolved.
Outdated
|
||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| // Save Alpha Radioactive Particles to register B | ||
| getCpu().getRegisterSet().getRegister("B").setValue(alphaParticles); | ||
| } | ||
|
|
||
| @Override | ||
| public char getId() { | ||
| return HWID; | ||
| } | ||
|
|
||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.