Skip to content

Commit 8593e15

Browse files
DSinMeliodasD45Hub
andauthored
Feature/last usecases (#29)
* implemented hard reset * implemented custom button sound * Added Options Screen and Mute Button concept. * Refactored Units class for metrics improvement. * Added CollectionHelper Test * Redesigned UI a bit and added resource icons. Co-authored-by: D45Hub <denis.thiessen@gmx.de>
1 parent d212410 commit 8593e15

39 files changed

+638
-111
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
4-
package="com.futurumgame.base">
4+
package="com.futurumgame.base" >
5+
56
<uses-permission android:name="android.permission.INTERNET" />
67

78
<application
@@ -10,17 +11,18 @@
1011
android:label="@string/app_name"
1112
android:roundIcon="@mipmap/futurum_launcher_round"
1213
android:supportsRtl="true"
13-
android:theme="@style/AppTheme">
14-
<activity android:name=".MainActivity">
14+
android:theme="@style/AppTheme" >
15+
<activity android:name=".ui.activities.OptionsViewActivity" />
16+
<activity android:name=".MainActivity" >
1517
<intent-filter>
1618
<action android:name="android.intent.action.MAIN" />
1719

1820
<category android:name="android.intent.category.LAUNCHER" />
1921
</intent-filter>
2022
</activity>
21-
<activity android:name=".ui.activities.ResourceViewActivity"></activity>
22-
<activity android:name=".ui.activities.FactoryManagerViewActivity"></activity>
23-
<activity android:name=".ui.activities.UnlockViewActivity"></activity>
23+
<activity android:name=".ui.activities.ResourceViewActivity" />
24+
<activity android:name=".ui.activities.FactoryManagerViewActivity" />
25+
<activity android:name=".ui.activities.UnlockViewActivity" />
2426

2527
<meta-data
2628
android:name="preloaded_fonts"

app/src/main/java/com/futurumgame/base/MainActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.futurumgame.base;
22

33
import android.os.Bundle;
4+
import android.widget.Button;
45
import android.widget.ImageButton;
56

67
import androidx.annotation.NonNull;
@@ -12,10 +13,12 @@
1213
import com.futurumgame.base.gameinternals.WareHouse;
1314
import com.futurumgame.base.resources.Resource;
1415
import com.futurumgame.base.serialization.AndroidFileHelper;
16+
import com.futurumgame.base.ui.activities.OptionsViewActivity;
1517
import com.futurumgame.base.ui.activities.UnlockViewActivity;
1618
import com.futurumgame.base.ui.activities.UpdatableViewActivity;
1719
import com.futurumgame.base.ui.adapter.ResourceAdapter;
1820
import com.futurumgame.base.ui.listeners.onclicklisteners.GoToViewListener;
21+
import com.futurumgame.base.ui.listeners.onclicklisteners.HardResetListener;
1922

2023
public class MainActivity extends UpdatableViewActivity {
2124

@@ -42,6 +45,9 @@ protected void onCreate(Bundle savedInstanceState) {
4245
resources.setAdapter(new ResourceAdapter(GameRoutine.getWareHouse().getWareHouseStocks()));
4346
allowUpdates();
4447
gameRoutine.start();
48+
49+
ImageButton settingsButton = findViewById(R.id.settingsButton);
50+
settingsButton.setOnClickListener(new GoToViewListener(OptionsViewActivity.class, this));
4551
}
4652

4753
@Override

app/src/main/java/com/futurumgame/base/additionalDatatypes/Units.java

Lines changed: 138 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -75,71 +75,21 @@ public void negate() {
7575
}
7676

7777
public void add(Units units) {
78-
if (units.isZero()) {
79-
return;
80-
}
81-
if (evaluateToNaNIfTrue(units, u -> isNaN() || u.isNaN())) {
82-
return;
83-
}
84-
if (evaluateToNegInfIfTrue(units,
85-
u -> isNegInfinity() && !u.isPosInfinity() || !isPosInfinity() && u.isNegInfinity())) {
86-
return;
87-
}
88-
if (evaluateToPosInfIfTrue(units,
89-
u -> isPosInfinity() && !u.isNegInfinity() || !isNegInfinity() && u.isPosInfinity())) {
90-
return;
91-
}
92-
if (evaluateToZeroIfTrue(units, u -> isInfinity() && u.isInfinity())) {
93-
return;
94-
}
95-
if (isZero()) {
96-
value = units.getValue();
97-
scale = units.getScale();
98-
return;
99-
}
100-
if (scale > units.scale) {
101-
value += rescaleValue(units.value, scale, units.scale);
102-
} else if (scale < units.scale) {
103-
value = units.value + rescaleValue(value, scale, units.scale);
104-
scale = units.scale;
105-
} else {
106-
value += units.value;
78+
boolean isUnneededAddition = checkIfUnneededAddition(units);
79+
80+
if (!isUnneededAddition && !checkAndExecuteZeroAddition(units)) {
81+
executeAddition(units);
82+
normalize();
10783
}
108-
normalize();
10984
}
11085

11186
public void subtract(Units units) {
112-
if (units.isZero()) {
113-
return;
114-
}
115-
if (evaluateToNaNIfTrue(units, u -> isNaN() || u.isNaN())) {
116-
return;
117-
}
118-
if (evaluateToNegInfIfTrue(units,
119-
u -> isNegInfinity() && !u.isNegInfinity() || !isPosInfinity() && u.isPosInfinity())) {
120-
return;
121-
}
122-
if (evaluateToPosInfIfTrue(units,
123-
u -> isPosInfinity() && !u.isPosInfinity() || !isNegInfinity() && u.isNegInfinity())) {
124-
return;
125-
}
126-
if (evaluateToZeroIfTrue(units, u -> isInfinity() && u.isInfinity())) {
127-
return;
128-
}
129-
if (isZero()) {
130-
value = -units.getValue();
131-
scale = units.getScale();
132-
return;
133-
}
134-
if (scale > units.scale) {
135-
value -= rescaleValue(units.value, scale, units.scale);
136-
} else if (scale < units.scale) {
137-
value = units.value + rescaleValue(value, scale, units.scale);
138-
scale = units.scale;
139-
} else {
140-
value -= units.value;
87+
boolean isUnneededSubtraction = checkIfUnneededSubtraction(units);
88+
89+
if (!isUnneededSubtraction && !checkAndExecuteZeroSubtraction(units)) {
90+
executeSubtraction(units);
91+
normalize();
14192
}
142-
normalize();
14393
}
14494

14595
public void multiply(Units units) {
@@ -150,8 +100,7 @@ public void multiply(Units units) {
150100
return;
151101
}
152102
if (evaluateToNegInfIfTrue(units,
153-
u -> isNegInfinity() && u.isBiggerThan(Zero) || isPosInfinity() && u.isSmallerThan(Zero)
154-
|| isBiggerThan(Zero) && u.isNegInfinity() || isSmallerThan(Zero) && u.isPosInfinity())) {
103+
u -> checkForMultiplicationNegativeInfinity(u))) {
155104
return;
156105
}
157106
if (evaluateToPosInfIfTrue(units, u -> isInfinity() || u.isInfinity())) {
@@ -413,6 +362,133 @@ private int calcScaleDiff(double rawValueDiff) {
413362
return (int) (scaleDiffRaw + (scaleDiffRaw >= 0 ? 0 : -1));
414363
}
415364

365+
private boolean checkIfUnneededAddition(Units unit) {
366+
boolean isUnneededAddition = false;
367+
368+
isUnneededAddition = unit.isZero();
369+
370+
isUnneededAddition = evaluateToNaNIfTrue(unit, u -> isNaN() || u.isNaN());
371+
372+
isUnneededAddition = evaluateToNegInfIfTrue(unit,
373+
u -> checkAdditionUnitsForNegativeInfinity(u));
374+
375+
isUnneededAddition = evaluateToPosInfIfTrue(unit,
376+
u -> checkAdditionUnitsForPositiveInfinity(u));
377+
378+
isUnneededAddition = evaluateToZeroIfTrue(unit, u -> isInfinity() && u.isInfinity());
379+
380+
return isUnneededAddition;
381+
}
382+
383+
private boolean checkAdditionUnitsForPositiveInfinity(Units otherUnit) {
384+
boolean isPrimaryUnitPositiveInfinity = isPosInfinity() && !otherUnit.isNegInfinity();
385+
boolean isSecondaryUnitPositiveInfinity = !isNegInfinity() && otherUnit.isPosInfinity();
386+
387+
return isPrimaryUnitPositiveInfinity || isSecondaryUnitPositiveInfinity;
388+
}
389+
390+
private boolean checkAdditionUnitsForNegativeInfinity(Units otherUnit) {
391+
boolean isPrimaryUnitNegativeInfinity = isNegInfinity() && !otherUnit.isPosInfinity();
392+
boolean isSecondaryUnitNegativeInfinity = !isPosInfinity() && otherUnit.isNegInfinity();
393+
394+
return isPrimaryUnitNegativeInfinity || isSecondaryUnitNegativeInfinity;
395+
}
396+
397+
private boolean checkIfUnneededSubtraction(Units unit) {
398+
boolean isUnneededSubtraction = false;
399+
400+
isUnneededSubtraction = unit.isZero();
401+
402+
boolean finalIsUnneededSubtraction = isUnneededSubtraction;
403+
isUnneededSubtraction = evaluateToNaNIfTrue(unit, u -> checkForNaNEvaluation(u, finalIsUnneededSubtraction));
404+
405+
boolean finalIsUnneededSubtraction1 = isUnneededSubtraction;
406+
isUnneededSubtraction = evaluateToNegInfIfTrue(unit, u -> checkSubtractionUnitsForNegativeInfinity(u) && !finalIsUnneededSubtraction1);
407+
408+
boolean finalIsUnneededSubtraction2 = isUnneededSubtraction;
409+
isUnneededSubtraction = evaluateToPosInfIfTrue(unit, u -> checkSubtractionUnitsForPositiveInfinity(u) && !finalIsUnneededSubtraction2);
410+
411+
boolean finalIsUnneededSubtraction3 = isUnneededSubtraction;
412+
isUnneededSubtraction = evaluateToZeroIfTrue(unit, u -> checkForInfinityEvaluation(u, finalIsUnneededSubtraction3));
413+
414+
return isUnneededSubtraction;
415+
}
416+
417+
private boolean checkForNaNEvaluation(Units unit, boolean enableEvaluation) {
418+
return (isNaN() || unit.isNaN()) && !enableEvaluation;
419+
}
420+
421+
private boolean checkForInfinityEvaluation(Units unit, boolean enableEvaluation) {
422+
return isInfinity() && unit.isInfinity() && !enableEvaluation;
423+
}
424+
425+
private boolean checkSubtractionUnitsForPositiveInfinity(Units otherUnit) {
426+
boolean isPrimaryUnitPositiveInfinity = isPosInfinity() && !otherUnit.isPosInfinity();
427+
boolean isSecondaryUnitPositiveInfinity = !isNegInfinity() && otherUnit.isNegInfinity();
428+
429+
return isPrimaryUnitPositiveInfinity || isSecondaryUnitPositiveInfinity;
430+
}
431+
432+
private boolean checkSubtractionUnitsForNegativeInfinity(Units otherUnit) {
433+
boolean isPrimaryUnitNegativeInfinity = isNegInfinity() && !otherUnit.isNegInfinity();
434+
boolean isSecondaryUnitNegativeInfinity = !isPosInfinity() && otherUnit.isPosInfinity();
435+
436+
return isPrimaryUnitNegativeInfinity || isSecondaryUnitNegativeInfinity;
437+
}
438+
439+
private boolean checkAndExecuteZeroAddition(Units addedUnit) {
440+
boolean isZero = isZero();
441+
442+
if (isZero) {
443+
value = addedUnit.getValue();
444+
scale = addedUnit.getScale();
445+
}
446+
447+
return isZero;
448+
}
449+
450+
private void executeAddition(Units addedUnit) {
451+
if (scale > addedUnit.scale) {
452+
value += rescaleValue(addedUnit.value, scale, addedUnit.scale);
453+
} else if (scale < addedUnit.scale) {
454+
value = addedUnit.value + rescaleValue(value, scale, addedUnit.scale);
455+
scale = addedUnit.scale;
456+
} else {
457+
value += addedUnit.value;
458+
}
459+
}
460+
461+
private boolean checkAndExecuteZeroSubtraction(Units subtractedValue) {
462+
boolean isZero = isZero();
463+
464+
if (isZero) {
465+
value = -subtractedValue.getValue();
466+
scale = subtractedValue.getScale();
467+
}
468+
469+
return isZero;
470+
}
471+
472+
private void executeSubtraction(Units subtractedUnit) {
473+
if (scale > subtractedUnit.scale) {
474+
value -= rescaleValue(subtractedUnit.value, scale, subtractedUnit.scale);
475+
} else if (scale < subtractedUnit.scale) {
476+
value = subtractedUnit.value + rescaleValue(value, scale, subtractedUnit.scale);
477+
scale = subtractedUnit.scale;
478+
} else {
479+
value -= subtractedUnit.value;
480+
}
481+
}
482+
483+
private boolean checkForMultiplicationNegativeInfinity(Units unit) {
484+
boolean isNegInfTimesPositiveValue = isNegInfinity() && unit.isBiggerThan(Zero);
485+
boolean isPosInfTimesNegativeValue = isPosInfinity() && unit.isSmallerThan(Zero);
486+
boolean isPositiveValueTimesNegInf = isBiggerThan(Zero) && unit.isNegInfinity();
487+
boolean isNegativeValueTimesPosInf = isSmallerThan(Zero) && unit.isPosInfinity();
488+
489+
return isNegInfTimesPositiveValue || isPosInfTimesNegativeValue || isPositiveValueTimesNegInf || isNegativeValueTimesPosInf;
490+
}
491+
416492
public static Units parse(String string) throws UnitsFormatException {
417493
ParseResult<Units> result = ParseResult.failResult();
418494
for (char c : string.toCharArray()) {

app/src/main/java/com/futurumgame/base/enums/DataFile.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public enum DataFile {
2020
private static final String SaveTag = "File Saving";
2121
private static final String ReadFileMessageFormat = "reading file: {0}";
2222
private static final String SaveFileMessageFormat = "saving file: {0}";
23+
private static final String ClearFileMessageFormat = "clearing file: {0}";
2324
private static final String FileEnding = ".ftrm";
2425
private static final ByteCompressor Compressor = ByteCompressor.newInstance(4, DataSize.KiloByte);
2526

@@ -51,4 +52,12 @@ public void save() {
5152
Log.e(SaveTag, String.format(SaveFileMessageFormat, fileName), e);
5253
}
5354
}
55+
56+
public void clear() {
57+
try {
58+
AndroidFileHelper.save(fileName, new byte[0]);
59+
} catch (IOException e) {
60+
Log.e(SaveTag, String.format(ClearFileMessageFormat, fileName), e);
61+
}
62+
}
5463
}

app/src/main/java/com/futurumgame/base/gameinternals/FactoryNode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public FactoryNode(Context context, Factory<T> current, PointF position) {
3636
setBackgroundColor(Colors.Black.getColor());
3737
setText(current.getResource().getName());
3838
setTextColor(Colors.White.getColor());
39+
setSoundEffectsEnabled(false);
3940
HashMap<String, Object> map = new HashMap<>();
4041
map.put(MetaData.FactoryNode.getMetaName(), this);
4142
setOnClickListener(new GoToViewListener(ResourceViewActivity.class, GameRoutine.getMainActivity(), map));
@@ -51,6 +52,8 @@ public int getResourceID(){
5152
return current.getResource().getID();
5253
}
5354

55+
public int getResourceIconID() { return current.getResource().getResourceIconId(); }
56+
5457
public String getResourceName() {
5558
return current.getResource().getName();
5659
}

app/src/main/java/com/futurumgame/base/gameinternals/GameRoutine.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.futurumgame.base.gameinternals;
22

3+
import android.annotation.SuppressLint;
34
import android.app.Activity;
5+
import android.app.AlarmManager;
6+
import android.app.PendingIntent;
7+
import android.content.Context;
8+
import android.content.Intent;
49
import android.os.Handler;
510
import android.os.Looper;
611

@@ -15,7 +20,9 @@
1520
import com.futurumgame.base.resources.Resource;
1621
import com.futurumgame.base.ui.activities.UpdatableViewActivity;
1722
import com.futurumgame.base.unlockables.UnlockableCollection;
23+
import com.futurumgame.base.util.Logger;
1824

25+
import java.util.Arrays;
1926
import java.util.Hashtable;
2027
import java.util.Stack;
2128
import java.util.Timer;
@@ -35,6 +42,7 @@ public class GameRoutine {
3542
private final Hashtable<Integer, Units> measuredDeltas = new Hashtable<>();
3643
private final UnlockableCollection resourceUnlockables = UnlockableCollection.createResourceUnlockables();
3744

45+
private boolean hardReset;
3846
private long tickRate = TimeUnits.Millisecond.inThisUnit(25);
3947
private Timer timer = new Timer(true);
4048

@@ -121,6 +129,25 @@ public static <T extends Resource> void addNewFactory(Factory<T> factory) {
121129
current.add(factory);
122130
}
123131

132+
public static boolean hardResetActivated() {
133+
return current.hardReset;
134+
}
135+
136+
public static void requestHardReset() {
137+
current.hardReset = true;
138+
Activity context = current.main;
139+
Logger.e(GameRoutine.class, "request hard reset");
140+
Arrays.stream(DataFile.values()).forEach(DataFile::clear);
141+
Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName() );
142+
@SuppressLint("WrongConstant")
143+
PendingIntent intent = PendingIntent.getActivity(
144+
context, 0,
145+
restartIntent, Intent.FLAG_ACTIVITY_CLEAR_TOP);
146+
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
147+
manager.set(AlarmManager.RTC, System.currentTimeMillis() + 100, intent);
148+
context.finish();
149+
}
150+
124151
public static void stop() {
125152
current.timer.cancel();
126153
}

0 commit comments

Comments
 (0)