Skip to content

Commit c460c7f

Browse files
amelak9srinner
authored andcommitted
CATTY-552 Clone object or actor
1 parent 8829853 commit c460c7f

File tree

24 files changed

+728
-6
lines changed

24 files changed

+728
-6
lines changed

src/Catty.xcodeproj/project.pbxproj

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,11 @@
12041204
972622DD25F51A8F00ABCC7A /* ChangeBrightnessByNBrick+CBXMLHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972622DC25F51A8F00ABCC7A /* ChangeBrightnessByNBrick+CBXMLHandler.swift */; };
12051205
972622E225F51B4500ABCC7A /* SetBrightnessBrick+CBXMLHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972622E125F51B4500ABCC7A /* SetBrightnessBrick+CBXMLHandler.swift */; };
12061206
9728AE9E25DEEE5A00708EB6 /* ProjectDetailStoreViewControllerReportExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9728AE9D25DEEE5A00708EB6 /* ProjectDetailStoreViewControllerReportExtension.swift */; };
1207+
973F1D3226B1923F0043108A /* CloneBrick+CBXMLHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973F1D3126B1923F0043108A /* CloneBrick+CBXMLHandler.swift */; };
1208+
9740489026B04FAE0047DEBB /* CloneBrick.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9740488F26B04FAE0047DEBB /* CloneBrick.swift */; };
1209+
9740489426B052950047DEBB /* CloneBrickCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9740489326B052950047DEBB /* CloneBrickCell.swift */; };
1210+
9740489626B0547D0047DEBB /* CloneBrick+Instruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9740489526B0547D0047DEBB /* CloneBrick+Instruction.swift */; };
1211+
9740489E26B097500047DEBB /* CloneBrickTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9740489D26B097500047DEBB /* CloneBrickTests.swift */; };
12071212
97417A9B265284400079A2A2 /* SoundsTableViewController+SelectFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97417A9A265284400079A2A2 /* SoundsTableViewController+SelectFile.swift */; };
12081213
9767BAFA26668ECD009794E8 /* JoinThreeStringsFunctionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767BAF926668ECD009794E8 /* JoinThreeStringsFunctionTest.swift */; };
12091214
97770B8825E5A88C00F51EFA /* SetBrightnessBrick.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97770B8725E5A88C00F51EFA /* SetBrightnessBrick.swift */; };
@@ -3454,6 +3459,11 @@
34543459
972622DC25F51A8F00ABCC7A /* ChangeBrightnessByNBrick+CBXMLHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ChangeBrightnessByNBrick+CBXMLHandler.swift"; sourceTree = "<group>"; };
34553460
972622E125F51B4500ABCC7A /* SetBrightnessBrick+CBXMLHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SetBrightnessBrick+CBXMLHandler.swift"; sourceTree = "<group>"; };
34563461
9728AE9D25DEEE5A00708EB6 /* ProjectDetailStoreViewControllerReportExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectDetailStoreViewControllerReportExtension.swift; sourceTree = "<group>"; };
3462+
973F1D3126B1923F0043108A /* CloneBrick+CBXMLHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "CloneBrick+CBXMLHandler.swift"; path = "CattyTests/Bricks/CloneBrick+CBXMLHandler.swift"; sourceTree = SOURCE_ROOT; };
3463+
9740488F26B04FAE0047DEBB /* CloneBrick.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloneBrick.swift; sourceTree = "<group>"; };
3464+
9740489326B052950047DEBB /* CloneBrickCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloneBrickCell.swift; sourceTree = "<group>"; };
3465+
9740489526B0547D0047DEBB /* CloneBrick+Instruction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloneBrick+Instruction.swift"; sourceTree = "<group>"; };
3466+
9740489D26B097500047DEBB /* CloneBrickTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloneBrickTests.swift; sourceTree = "<group>"; };
34573467
97417A9A265284400079A2A2 /* SoundsTableViewController+SelectFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SoundsTableViewController+SelectFile.swift"; sourceTree = "<group>"; };
34583468
9767BAF926668ECD009794E8 /* JoinThreeStringsFunctionTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinThreeStringsFunctionTest.swift; sourceTree = "<group>"; };
34593469
97770B8725E5A88C00F51EFA /* SetBrightnessBrick.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetBrightnessBrick.swift; sourceTree = "<group>"; };
@@ -4110,6 +4120,7 @@
41104120
C286B2695528549DC9B2916D /* af */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = af; path = af.lproj/Localizable.strings; sourceTree = "<group>"; };
41114121
C42D117BCEADFF7368CA3159 /* bn */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.strings; name = bn; path = bn.lproj/Localizable.strings; sourceTree = "<group>"; };
41124122
C85A5C9F267A218F009BA454 /* Functions_0993.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Functions_0993.xml; sourceTree = "<group>"; };
4123+
C88FFF5D26B830E100D381D8 /* BrickObjectWithOutBackgroundProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrickObjectWithOutBackgroundProtocol.h; sourceTree = "<group>"; };
41134124
C8A0338226064F3C00702911 /* SetTempoToBrick+CBXMLHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "SetTempoToBrick+CBXMLHandler.swift"; path = "Catty/Views/Custom/CollectionViewCells/BrickCells/Sound/SetTempoToBrick+CBXMLHandler.swift"; sourceTree = SOURCE_ROOT; };
41144125
C8CD7DD325E63D0A0018C655 /* BrickCategoryOverviewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrickCategoryOverviewControllerTests.swift; sourceTree = "<group>"; };
41154126
C8D010C3264BD2B700896DEB /* JoinThreeStringsFunction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinThreeStringsFunction.swift; sourceTree = "<group>"; };
@@ -5911,6 +5922,7 @@
59115922
9990BB6C1D89D89A0088357A /* BrickStaticChoiceProtocol.h */,
59125923
4C1EB20F1AC19B3D0001F431 /* BrickTextProtocol.h */,
59135924
4CC0D51F1B01FB73006193C4 /* BrickVariableProtocol.h */,
5925+
C88FFF5D26B830E100D381D8 /* BrickObjectWithOutBackgroundProtocol.h */,
59145926
);
59155927
path = BrickData;
59165928
sourceTree = "<group>";
@@ -6266,6 +6278,7 @@
62666278
AA74EEDA1BC057B900D1E954 /* WaitBrick+CBXMLHandler.m */,
62676279
BA987D042194DDCF002DAA05 /* WaitUntilBrick+CBXMLHandler.h */,
62686280
BA987D032194DDCF002DAA05 /* WaitUntilBrick+CBXMLHandler.m */,
6281+
973F1D3126B1923F0043108A /* CloneBrick+CBXMLHandler.swift */,
62696282
);
62706283
name = Control;
62716284
path = ControlBricks;
@@ -7106,6 +7119,7 @@
71067119
83F8230725EBA9610093DD9A /* SetBackgroundByIndexBrickTests.swift */,
71077120
2E8780A72542BCE200816B52 /* WebRequestBrickTests.swift */,
71087121
0580514826EF734F00F719E0 /* StartRunningStitchBrickTests.swift */,
7122+
9740489D26B097500047DEBB /* CloneBrickTests.swift */,
71097123
);
71107124
path = Bricks;
71117125
sourceTree = "<group>";
@@ -9586,6 +9600,7 @@
95869600
AA74EE1F1BC053FD00D1E954 /* BroadcastWaitBrick+Instruction.swift */,
95879601
AA74EE201BC053FD00D1E954 /* WaitBrick+Instruction.swift */,
95889602
BA987D0E2194EA1F002DAA05 /* WaitUntilBrick+Instruction.swift */,
9603+
9740489526B0547D0047DEBB /* CloneBrick+Instruction.swift */,
95899604
);
95909605
name = Control;
95919606
sourceTree = "<group>";
@@ -9719,6 +9734,7 @@
97199734
AA74EF951BC05B5F00D1E954 /* WaitBrick.m */,
97209735
BA987D072194E158002DAA05 /* WaitUntilBrick.h */,
97219736
BA987D062194E157002DAA05 /* WaitUntilBrick.m */,
9737+
9740488F26B04FAE0047DEBB /* CloneBrick.swift */,
97229738
);
97239739
path = Control;
97249740
sourceTree = "<group>";
@@ -9959,6 +9975,7 @@
99599975
9EDCD22422886FD90040EFE3 /* WaitBrickCell.swift */,
99609976
BA987D0A2194E25A002DAA05 /* WaitUntilBrickCell.h */,
99619977
BA987D092194E25A002DAA05 /* WaitUntilBrickCell.m */,
9978+
9740489326B052950047DEBB /* CloneBrickCell.swift */,
99629979
);
99639980
path = Control;
99649981
sourceTree = "<group>";
@@ -11874,6 +11891,7 @@
1187411891
9E24D7032326E8E600608203 /* TurnLeftBrickTests.swift in Sources */,
1187511892
E57E6D872540414700E775DF /* SetVolumeToBrickTests.swift in Sources */,
1187611893
4C968C401F00288500355C0D /* BrickTests.swift in Sources */,
11894+
9740489E26B097500047DEBB /* CloneBrickTests.swift in Sources */,
1187711895
E579F10B253D98B0009107C8 /* PhiroPlayToneBrickTests.swift in Sources */,
1187811896
E579F114253DCA96009107C8 /* ThinkBubbleBrickTests.swift in Sources */,
1187911897
4C0F9FD9204BD3D500E71B2D /* RepeatUntilBrickTests.swift in Sources */,
@@ -12213,6 +12231,7 @@
1221312231
AA74F0BD1BC05FCE00D1E954 /* PlaceAtBrickCell.m in Sources */,
1221412232
18390A6924D0576100A07DFD /* StampBrick.swift in Sources */,
1221512233
CA3E72E81B0C00A500D6B184 /* CBStack.swift in Sources */,
12234+
9740489426B052950047DEBB /* CloneBrickCell.swift in Sources */,
1221612235
AA74EFFE1BC05B5F00D1E954 /* ComeToFrontBrick.m in Sources */,
1221712236
057B182A26DC8B6A00C47E60 /* StartRunningStitchBrick.swift in Sources */,
1221812237
92FF31051A24DCAA00093DA7 /* WhenScript.m in Sources */,
@@ -12232,17 +12251,20 @@
1223212251
2D6E3F3B210A0AB700FB8139 /* ChartProjectsStoreViewController.swift in Sources */,
1223312252
92FF2EA41A24C7D800093DA7 /* Util.m in Sources */,
1223412253
AA74EFEC1BC05B5F00D1E954 /* ChangeVariableBrick.m in Sources */,
12254+
973F1D3226B1923F0043108A /* CloneBrick+CBXMLHandler.swift in Sources */,
1223512255
92FF31031A24DCAA00093DA7 /* Script.m in Sources */,
1223612256
4C822693213FBC4400F3D750 /* MultiFingerTouchedFunction.swift in Sources */,
1223712257
4420ACB1250929AE00951328 /* AskBrick+CBXMLHandler.swift in Sources */,
1223812258
1882475924C84D9C00B01653 /* SetPenColorBrickCell.swift in Sources */,
1223912259
4C0F9F9E204BD2B100E71B2D /* SayBubbleBrickCell.m in Sources */,
1224012260
4C2EE41E1B555B55006DE9B8 /* CBXMLOpenedNestingBricksStack.m in Sources */,
1224112261
5EFBD5F92145533B003B3CDC /* ProjectDescriptionViewController.swift in Sources */,
12262+
9740489626B0547D0047DEBB /* CloneBrick+Instruction.swift in Sources */,
1224212263
92FF31571A24DEB300093DA7 /* ObjectTableViewController.m in Sources */,
1224312264
4CE3D68F2107B68600005629 /* FaceDetectionManagerProtocol.swift in Sources */,
1224412265
929CC0EF1BC39B8C0027DEC0 /* PhiroMotorStopBrickCell.m in Sources */,
1224512266
4C0F9F64204BD18600E71B2D /* SayForBubbleBrick+CBXMLHandler.m in Sources */,
12267+
9740489026B04FAE0047DEBB /* CloneBrick.swift in Sources */,
1224612268
92FF32BB1A24E2F400093DA7 /* DarkBlueGradientImageCell.m in Sources */,
1224712269
92FF314E1A24DEB300093DA7 /* LookImageViewController.m in Sources */,
1224812270
AA74F0A41BC05FCE00D1E954 /* LoopEndBrickCell.m in Sources */,
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/**
2+
* Copyright (C) 2010-2021 The Catrobat Team
3+
* (http://developer.catrobat.org/credits)
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Affero General Public License as
7+
* published by the Free Software Foundation, either version 3 of the
8+
* License, or (at your option) any later version.
9+
*
10+
* An additional term exception under section 7 of the GNU Affero
11+
* General Public License, version 3, is available at
12+
* (http://developer.catrobat.org/license_additional_term)
13+
*
14+
* This program is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+
* GNU Affero General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Affero General Public License
20+
* along with this program. If not, see http://www.gnu.org/licenses/.
21+
*/
22+
23+
@objc extension CloneBrick: CBInstructionProtocol {
24+
25+
@nonobjc func instruction() -> CBInstruction {
26+
.action { context in SKAction.run(self.actionBlock(context.formulaInterpreter)) }
27+
}
28+
29+
func actionBlock(_ formulaInterpreter: FormulaInterpreterProtocol) -> () -> Void {
30+
guard let objectToClone = self.objectToClone
31+
else { fatalError("This should never happen!") }
32+
33+
return {
34+
let object = SpriteObject()
35+
object.name = objectToClone.name + "Copy " + String(CloneBrick.nameCounter)
36+
CloneBrick.nameCounter += 1
37+
38+
guard let scriptList = objectToClone.scriptList as NSMutableArray? as? [Script] else {
39+
//fatalError
40+
debugPrint("!! No script list given in object: \(objectToClone) !!")
41+
return
42+
}
43+
44+
for script in scriptList {
45+
switch script {
46+
case let startScript as StartScript:
47+
let newStartScript = StartScript()
48+
newStartScript.object = object
49+
newStartScript.brickList = startScript.brickList.mutableCopy() as? NSMutableArray
50+
for brick in newStartScript.brickList {
51+
(brick as! Brick).script = newStartScript as Script
52+
}
53+
object.scriptList.add(newStartScript)
54+
55+
case let whenScript as WhenScript:
56+
let newWhenScript = WhenScript()
57+
newWhenScript.object = object
58+
newWhenScript.brickList = whenScript.brickList.mutableCopy() as? NSMutableArray
59+
for brick in newWhenScript.brickList {
60+
(brick as! Brick).script = newWhenScript as Script
61+
}
62+
object.scriptList.add(newWhenScript)
63+
64+
case let whenTouchDownScript as WhenTouchDownScript:
65+
let newWhenTouchDownScript = WhenTouchDownScript()
66+
newWhenTouchDownScript.object = object
67+
newWhenTouchDownScript.brickList = whenTouchDownScript.brickList.mutableCopy() as? NSMutableArray
68+
for brick in newWhenTouchDownScript.brickList {
69+
(brick as! Brick).script = newWhenTouchDownScript as Script
70+
}
71+
object.scriptList.add(newWhenTouchDownScript)
72+
73+
case let whenBackgroundChangesScript as WhenBackgroundChangesScript:
74+
let newWhenBackgroundChangesScript = WhenBackgroundChangesScript()
75+
newWhenBackgroundChangesScript.object = object
76+
newWhenBackgroundChangesScript.brickList = whenBackgroundChangesScript.brickList.mutableCopy() as? NSMutableArray
77+
for brick in newWhenBackgroundChangesScript.brickList {
78+
(brick as! Brick).script = newWhenBackgroundChangesScript as Script
79+
}
80+
object.scriptList.add(newWhenBackgroundChangesScript)
81+
82+
case let bcScript as BroadcastScript:
83+
let newBcScript = BroadcastScript()
84+
newBcScript.object = object
85+
newBcScript.brickList = bcScript.brickList.mutableCopy() as? NSMutableArray
86+
for brick in newBcScript.brickList {
87+
(brick as! Brick).script = newBcScript as Script
88+
}
89+
object.scriptList.add(newBcScript)
90+
91+
case let whenConditionScript as WhenConditionScript:
92+
let newWhenConditionScript = WhenConditionScript()
93+
newWhenConditionScript.object = object
94+
newWhenConditionScript.brickList = whenConditionScript.brickList.mutableCopy() as? NSMutableArray
95+
for brick in newWhenConditionScript.brickList {
96+
(brick as! Brick).script = newWhenConditionScript as Script
97+
}
98+
object.scriptList.add(newWhenConditionScript)
99+
100+
default:
101+
break
102+
}
103+
}
104+
105+
object.soundList = objectToClone.soundList.mutableCopy() as? NSMutableArray
106+
object.lookList = objectToClone.lookList.mutableCopy() as? NSMutableArray
107+
108+
let variables = UserDataContainer.objectVariables(for: objectToClone)
109+
let lists = UserDataContainer.objectLists(for: objectToClone)
110+
111+
for variable in variables {
112+
let var1 = variable as UserVariable
113+
object.userData.add(var1)
114+
}
115+
for list in lists {
116+
let list1 = list as UserList
117+
object.userData.add(list1)
118+
}
119+
120+
objectToClone.scene.add(object: object)
121+
let spriteNode = CBSpriteNode(spriteObject: object)
122+
object.spriteNode = spriteNode
123+
124+
let stage = objectToClone.spriteNode.scene as? Stage
125+
stage?.addChild(object.spriteNode)
126+
object.spriteNode.startAsCopy(objectToClone.spriteNode)
127+
stage?.scheduler.registerSpriteNode(object.spriteNode)
128+
stage?.addCopiedObjecToProject(spriteObject: object)
129+
}
130+
}
131+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/**
2+
* Copyright (C) 2010-2021 The Catrobat Team
3+
* (http://developer.catrobat.org/credits)
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Affero General Public License as
7+
* published by the Free Software Foundation, either version 3 of the
8+
* License, or (at your option) any later version.
9+
*
10+
* An additional term exception under section 7 of the GNU Affero
11+
* General Public License, version 3, is available at
12+
* (http://developer.catrobat.org/license_additional_term)
13+
*
14+
* This program is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+
* GNU Affero General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Affero General Public License
20+
* along with this program. If not, see http://www.gnu.org/licenses/.
21+
*/
22+
23+
@objc(CloneBrick)
24+
@objcMembers class CloneBrick: Brick, BrickObjectWithOutBackgroundProtocol {
25+
26+
var objectToClone: SpriteObject?
27+
static var nameCounter: Int = 1
28+
29+
override required init() {
30+
super.init()
31+
}
32+
33+
func category() -> kBrickCategoryType {
34+
kBrickCategoryType.eventBrick
35+
}
36+
37+
override class func description() -> String {
38+
"CloneBrick"
39+
}
40+
41+
override func getRequiredResources() -> Int {
42+
ResourceType.noResources.rawValue
43+
}
44+
45+
override func brickCell() -> BrickCellProtocol.Type! {
46+
CloneBrickCell.self as BrickCellProtocol.Type
47+
}
48+
49+
func setObject(_ object: SpriteObject?, forLineNumber lineNumber: Int, andParameterNumber paramNumber: Int) {
50+
if let object = object {
51+
objectToClone = object
52+
}
53+
}
54+
55+
func object(forLineNumber lineNumber: Int, andParameterNumber paramNumber: Int) -> SpriteObject? {
56+
self.objectToClone
57+
}
58+
59+
override func setDefaultValuesFor(_ spriteObject: SpriteObject!) {
60+
if spriteObject != nil {
61+
objectToClone = spriteObject
62+
} else {
63+
objectToClone = self.script.object
64+
}
65+
}
66+
67+
override func isDisabledForBackground() -> Bool {
68+
true
69+
}
70+
71+
@objc(mutableCopyWithContext:)
72+
override func mutableCopy(with context: CBMutableCopyContext) -> Any {
73+
let brick = CloneBrick()
74+
if self.objectToClone != nil {
75+
brick.objectToClone = self.objectToClone
76+
}
77+
return brick
78+
}
79+
}

src/Catty/DataModel/Bricks/Motion/PointToBrick.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#import "Brick.h"
2525
#import "BrickObjectProtocol.h"
26+
#import "BrickObjectWithOutBackgroundProtocol.h"
2627

2728
@class SpriteObject;
2829

src/Catty/DataModel/Scene/Scene.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@
7878
self._objects
7979
}
8080

81+
func objectsWithoutBackground() -> [SpriteObject] {
82+
let backgroundObjects = self.numberOfBackgroundObjects()
83+
return [SpriteObject](self._objects[backgroundObjects...])
84+
}
85+
8186
@objc(objectAtIndex:)
8287
func object(at index: Int) -> SpriteObject? {
8388
if index >= 0 && index < self._objects.count {

src/Catty/Defines/LanguageTranslationDefines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@
379379
#define kLocalizedEndOfLoop NSLocalizedString(@"End of Loop", nil)
380380
#define kLocalizedWhen NSLocalizedString(@"When", nil)
381381
#define kLocalizedBecomesTrue NSLocalizedString(@"becomes true", nil)
382+
#define kLocalizedCreateCloneOf NSLocalizedString(@"Create clone of", nil)
382383

383384
// motion bricks
384385
#define kLocalizedPlaceAt NSLocalizedString(@"Place at ", nil)

0 commit comments

Comments
 (0)